//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS Kendra service.
///
/// Amazon Kendra is a service for indexing large document sets.
public struct Kendra: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the Kendra client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            amzTarget: "AWSKendraFrontendService",
            serviceName: "Kendra",
            serviceIdentifier: "kendra",
            serviceProtocol: .json(version: "1.1"),
            apiVersion: "2019-02-03",
            endpoint: endpoint,
            variantEndpoints: Self.variantEndpoints,
            errorType: KendraErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }




    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.fips]: .init(endpoints: [
            "ca-central-1": "kendra-fips.ca-central-1.amazonaws.com",
            "us-east-1": "kendra-fips.us-east-1.amazonaws.com",
            "us-east-2": "kendra-fips.us-east-2.amazonaws.com",
            "us-gov-west-1": "kendra-fips.us-gov-west-1.amazonaws.com",
            "us-west-2": "kendra-fips.us-west-2.amazonaws.com"
        ])
    ]}

    // MARK: API Calls

    /// Grants users or groups in your IAM Identity Center identity source access  to your Amazon Kendra experience. You can create an Amazon Kendra experience such as a  search application. For more information on creating a search application  experience, see Building  a search experience with no code.
    @Sendable
    @inlinable
    public func associateEntitiesToExperience(_ input: AssociateEntitiesToExperienceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateEntitiesToExperienceResponse {
        try await self.client.execute(
            operation: "AssociateEntitiesToExperience", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Grants users or groups in your IAM Identity Center identity source access  to your Amazon Kendra experience. You can create an Amazon Kendra experience such as a  search application. For more information on creating a search application  experience, see Building  a search experience with no code.
    ///
    /// Parameters:
    ///   - entityList: Lists users or groups in your IAM Identity Center identity source.
    ///   - id: The identifier of your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateEntitiesToExperience(
        entityList: [EntityConfiguration],
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateEntitiesToExperienceResponse {
        let input = AssociateEntitiesToExperienceRequest(
            entityList: entityList, 
            id: id, 
            indexId: indexId
        )
        return try await self.associateEntitiesToExperience(input, logger: logger)
    }

    /// Defines the specific permissions of users or groups in your IAM Identity Center identity source with access to your Amazon Kendra experience. You can create an Amazon Kendra  experience such as a search application. For more information on creating a  search application experience, see Building  a search experience with no code.
    @Sendable
    @inlinable
    public func associatePersonasToEntities(_ input: AssociatePersonasToEntitiesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociatePersonasToEntitiesResponse {
        try await self.client.execute(
            operation: "AssociatePersonasToEntities", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Defines the specific permissions of users or groups in your IAM Identity Center identity source with access to your Amazon Kendra experience. You can create an Amazon Kendra  experience such as a search application. For more information on creating a  search application experience, see Building  a search experience with no code.
    ///
    /// Parameters:
    ///   - id: The identifier of your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - personas: The personas that define the specific permissions of users or groups in  your IAM Identity Center identity source. The available personas or access  roles are Owner and Viewer. For more information  on these personas, see Providing  access to your search page.
    ///   - logger: Logger use during operation
    @inlinable
    public func associatePersonasToEntities(
        id: String,
        indexId: String,
        personas: [EntityPersonaConfiguration],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociatePersonasToEntitiesResponse {
        let input = AssociatePersonasToEntitiesRequest(
            id: id, 
            indexId: indexId, 
            personas: personas
        )
        return try await self.associatePersonasToEntities(input, logger: logger)
    }

    /// Removes one or more documents from an index. The documents must have been added with the BatchPutDocument API. The documents are deleted asynchronously. You can see the progress of the deletion by using Amazon Web Services CloudWatch. Any error messages related to the processing of the batch are sent to your Amazon Web Services CloudWatch log. You can also use the BatchGetDocumentStatus API to monitor the progress of deleting your documents. Deleting documents from an index using BatchDeleteDocument could take up to an hour or more, depending on the number of documents you want to delete.
    @Sendable
    @inlinable
    public func batchDeleteDocument(_ input: BatchDeleteDocumentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> BatchDeleteDocumentResponse {
        try await self.client.execute(
            operation: "BatchDeleteDocument", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes one or more documents from an index. The documents must have been added with the BatchPutDocument API. The documents are deleted asynchronously. You can see the progress of the deletion by using Amazon Web Services CloudWatch. Any error messages related to the processing of the batch are sent to your Amazon Web Services CloudWatch log. You can also use the BatchGetDocumentStatus API to monitor the progress of deleting your documents. Deleting documents from an index using BatchDeleteDocument could take up to an hour or more, depending on the number of documents you want to delete.
    ///
    /// Parameters:
    ///   - dataSourceSyncJobMetricTarget: 
    ///   - documentIdList: One or more identifiers for documents to delete from the index.
    ///   - indexId: The identifier of the index that contains the documents to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func batchDeleteDocument(
        dataSourceSyncJobMetricTarget: DataSourceSyncJobMetricTarget? = nil,
        documentIdList: [String],
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> BatchDeleteDocumentResponse {
        let input = BatchDeleteDocumentRequest(
            dataSourceSyncJobMetricTarget: dataSourceSyncJobMetricTarget, 
            documentIdList: documentIdList, 
            indexId: indexId
        )
        return try await self.batchDeleteDocument(input, logger: logger)
    }

    /// Removes one or more sets of featured results. Features results are placed above all other results for certain queries. If there's an exact match of a  query, then one or more specific documents are featured in the search results.
    @Sendable
    @inlinable
    public func batchDeleteFeaturedResultsSet(_ input: BatchDeleteFeaturedResultsSetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> BatchDeleteFeaturedResultsSetResponse {
        try await self.client.execute(
            operation: "BatchDeleteFeaturedResultsSet", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes one or more sets of featured results. Features results are placed above all other results for certain queries. If there's an exact match of a  query, then one or more specific documents are featured in the search results.
    ///
    /// Parameters:
    ///   - featuredResultsSetIds: The identifiers of the featured results sets that you want to delete.
    ///   - indexId: The identifier of the index used for featuring results.
    ///   - logger: Logger use during operation
    @inlinable
    public func batchDeleteFeaturedResultsSet(
        featuredResultsSetIds: [String],
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> BatchDeleteFeaturedResultsSetResponse {
        let input = BatchDeleteFeaturedResultsSetRequest(
            featuredResultsSetIds: featuredResultsSetIds, 
            indexId: indexId
        )
        return try await self.batchDeleteFeaturedResultsSet(input, logger: logger)
    }

    /// Returns the indexing status for one or more documents submitted with the  BatchPutDocument API. When you use the BatchPutDocument API, documents are indexed asynchronously. You can use the BatchGetDocumentStatus API to get the current status of a list of documents so that you can determine if they have been successfully indexed. You can also use the BatchGetDocumentStatus API to check the status of the  BatchDeleteDocument API. When a document is deleted from the index, Amazon Kendra returns NOT_FOUND as the status.
    @Sendable
    @inlinable
    public func batchGetDocumentStatus(_ input: BatchGetDocumentStatusRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> BatchGetDocumentStatusResponse {
        try await self.client.execute(
            operation: "BatchGetDocumentStatus", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the indexing status for one or more documents submitted with the  BatchPutDocument API. When you use the BatchPutDocument API, documents are indexed asynchronously. You can use the BatchGetDocumentStatus API to get the current status of a list of documents so that you can determine if they have been successfully indexed. You can also use the BatchGetDocumentStatus API to check the status of the  BatchDeleteDocument API. When a document is deleted from the index, Amazon Kendra returns NOT_FOUND as the status.
    ///
    /// Parameters:
    ///   - documentInfoList: A list of DocumentInfo objects that identify the documents for which to get the status. You identify the documents by their document ID and optional attributes.
    ///   - indexId: The identifier of the index to add documents to. The index ID is returned by the CreateIndex API.
    ///   - logger: Logger use during operation
    @inlinable
    public func batchGetDocumentStatus(
        documentInfoList: [DocumentInfo],
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> BatchGetDocumentStatusResponse {
        let input = BatchGetDocumentStatusRequest(
            documentInfoList: documentInfoList, 
            indexId: indexId
        )
        return try await self.batchGetDocumentStatus(input, logger: logger)
    }

    /// Adds one or more documents to an index. The BatchPutDocument API enables you to ingest inline documents or a set of documents stored in an Amazon S3 bucket. Use this API to ingest your text and unstructured text into an index, add custom attributes to the documents, and to attach an access control list to the documents added to the index. The documents are indexed asynchronously. You can see the progress of the batch using Amazon Web Services CloudWatch. Any error messages related to processing the batch are sent to your Amazon Web Services CloudWatch log. You can also use the BatchGetDocumentStatus API to monitor the progress of indexing your documents. For an example of ingesting inline documents using Python and Java SDKs, see Adding files directly to an index.
    @Sendable
    @inlinable
    public func batchPutDocument(_ input: BatchPutDocumentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> BatchPutDocumentResponse {
        try await self.client.execute(
            operation: "BatchPutDocument", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds one or more documents to an index. The BatchPutDocument API enables you to ingest inline documents or a set of documents stored in an Amazon S3 bucket. Use this API to ingest your text and unstructured text into an index, add custom attributes to the documents, and to attach an access control list to the documents added to the index. The documents are indexed asynchronously. You can see the progress of the batch using Amazon Web Services CloudWatch. Any error messages related to processing the batch are sent to your Amazon Web Services CloudWatch log. You can also use the BatchGetDocumentStatus API to monitor the progress of indexing your documents. For an example of ingesting inline documents using Python and Java SDKs, see Adding files directly to an index.
    ///
    /// Parameters:
    ///   - customDocumentEnrichmentConfiguration: Configuration information for altering your document metadata and content during the document ingestion process when you use the BatchPutDocument API. For more information on how to create, modify and delete document metadata, or make other content alterations when you ingest documents into Amazon Kendra, see Customizing document metadata during the ingestion process.
    ///   - documents: One or more documents to add to the index. Documents have the following file size limits.   50 MB total size for any file   5 MB extracted text for any file   For more information, see Quotas.
    ///   - indexId: The identifier of the index to add the documents to. You need to create the index first using the CreateIndex API.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission to access your S3 bucket. For more information, see IAM access roles for Amazon Kendra.
    ///   - logger: Logger use during operation
    @inlinable
    public func batchPutDocument(
        customDocumentEnrichmentConfiguration: CustomDocumentEnrichmentConfiguration? = nil,
        documents: [Document],
        indexId: String,
        roleArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> BatchPutDocumentResponse {
        let input = BatchPutDocumentRequest(
            customDocumentEnrichmentConfiguration: customDocumentEnrichmentConfiguration, 
            documents: documents, 
            indexId: indexId, 
            roleArn: roleArn
        )
        return try await self.batchPutDocument(input, logger: logger)
    }

    /// Clears existing query suggestions from an index. This deletes existing suggestions only, not the queries  in the query log. After you clear suggestions, Amazon Kendra learns  new suggestions based on new queries added to the query log  from the time you cleared suggestions. If you do not see any  new suggestions, then please allow Amazon Kendra to collect  enough queries to learn new suggestions.  ClearQuerySuggestions is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func clearQuerySuggestions(_ input: ClearQuerySuggestionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "ClearQuerySuggestions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Clears existing query suggestions from an index. This deletes existing suggestions only, not the queries  in the query log. After you clear suggestions, Amazon Kendra learns  new suggestions based on new queries added to the query log  from the time you cleared suggestions. If you do not see any  new suggestions, then please allow Amazon Kendra to collect  enough queries to learn new suggestions.  ClearQuerySuggestions is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index you want to clear query suggestions from.
    ///   - logger: Logger use during operation
    @inlinable
    public func clearQuerySuggestions(
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = ClearQuerySuggestionsRequest(
            indexId: indexId
        )
        return try await self.clearQuerySuggestions(input, logger: logger)
    }

    /// Creates an access configuration for your documents. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents. You can use this to re-configure your existing document level access control without indexing all of your documents again. For example, your index contains top-secret company documents that only certain employees or users should access. One of these users leaves the company or switches to a team that should be blocked from accessing top-secret documents. The user still has access to top-secret documents because the user had access when your documents were previously indexed. You can create a specific access control configuration for the user with deny access. You can later update the access control configuration to allow access if the user returns to the company and re-joins the 'top-secret' team. You can re-configure access control for your documents as circumstances change. To apply your access control configuration to certain documents, you call the BatchPutDocument API with the AccessControlConfigurationId included in the Document object. If you use an S3 bucket as a data source, you update the .metadata.json with the AccessControlConfigurationId and synchronize your data source. Amazon Kendra currently only supports access control configuration for S3 data sources and documents indexed using the BatchPutDocument API.  You can't configure access control using CreateAccessControlConfiguration for an Amazon Kendra Gen AI Enterprise Edition index. Amazon Kendra will return a ValidationException error for a Gen_AI_ENTERPRISE_EDITION index.
    @Sendable
    @inlinable
    public func createAccessControlConfiguration(_ input: CreateAccessControlConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAccessControlConfigurationResponse {
        try await self.client.execute(
            operation: "CreateAccessControlConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an access configuration for your documents. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents. You can use this to re-configure your existing document level access control without indexing all of your documents again. For example, your index contains top-secret company documents that only certain employees or users should access. One of these users leaves the company or switches to a team that should be blocked from accessing top-secret documents. The user still has access to top-secret documents because the user had access when your documents were previously indexed. You can create a specific access control configuration for the user with deny access. You can later update the access control configuration to allow access if the user returns to the company and re-joins the 'top-secret' team. You can re-configure access control for your documents as circumstances change. To apply your access control configuration to certain documents, you call the BatchPutDocument API with the AccessControlConfigurationId included in the Document object. If you use an S3 bucket as a data source, you update the .metadata.json with the AccessControlConfigurationId and synchronize your data source. Amazon Kendra currently only supports access control configuration for S3 data sources and documents indexed using the BatchPutDocument API.  You can't configure access control using CreateAccessControlConfiguration for an Amazon Kendra Gen AI Enterprise Edition index. Amazon Kendra will return a ValidationException error for a Gen_AI_ENTERPRISE_EDITION index.
    ///
    /// Parameters:
    ///   - accessControlList: Information on principals (users and/or groups) and which documents they should have access to. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.
    ///   - clientToken: A token that you provide to identify the request to create an access control configuration. Multiple calls to the CreateAccessControlConfiguration API with the same client token will create only one access control configuration.
    ///   - description: A description for the access control configuration.
    ///   - hierarchicalAccessControlList: The list of principal lists that define the hierarchy for which documents users should have access to.
    ///   - indexId: The identifier of the index to create an access control configuration for your documents.
    ///   - name: A name for the access control configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func createAccessControlConfiguration(
        accessControlList: [Principal]? = nil,
        clientToken: String? = CreateAccessControlConfigurationRequest.idempotencyToken(),
        description: String? = nil,
        hierarchicalAccessControlList: [HierarchicalPrincipal]? = nil,
        indexId: String,
        name: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAccessControlConfigurationResponse {
        let input = CreateAccessControlConfigurationRequest(
            accessControlList: accessControlList, 
            clientToken: clientToken, 
            description: description, 
            hierarchicalAccessControlList: hierarchicalAccessControlList, 
            indexId: indexId, 
            name: name
        )
        return try await self.createAccessControlConfiguration(input, logger: logger)
    }

    /// Creates a data source connector that you want to use with an Amazon Kendra index. You specify a name, data source connector type and description for your data source. You also specify configuration information for the data source connector.  CreateDataSource is a synchronous operation. The operation returns 200 if the data source was successfully created. Otherwise, an exception is raised. For an example of creating an index and data source using the Python SDK, see Getting started with Python SDK. For an example of creating an index and data source using the Java SDK, see Getting started with Java SDK.
    @Sendable
    @inlinable
    public func createDataSource(_ input: CreateDataSourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateDataSourceResponse {
        try await self.client.execute(
            operation: "CreateDataSource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a data source connector that you want to use with an Amazon Kendra index. You specify a name, data source connector type and description for your data source. You also specify configuration information for the data source connector.  CreateDataSource is a synchronous operation. The operation returns 200 if the data source was successfully created. Otherwise, an exception is raised. For an example of creating an index and data source using the Python SDK, see Getting started with Python SDK. For an example of creating an index and data source using the Java SDK, see Getting started with Java SDK.
    ///
    /// Parameters:
    ///   - clientToken: A token that you provide to identify the request to create a data source connector. Multiple calls to the CreateDataSource API with the same client token will create only one data source connector.
    ///   - configuration: Configuration information to connect to your data source repository. You can't specify the Configuration parameter when the Type parameter is set to CUSTOM. If you do, you receive a ValidationException exception. The Configuration parameter is required for all other data sources.
    ///   - customDocumentEnrichmentConfiguration: Configuration information for altering document metadata and content during the document ingestion process. For more information on how to create, modify and delete document metadata, or make other content alterations when you ingest documents into Amazon Kendra, see Customizing document metadata during the ingestion process.
    ///   - description: A description for the data source connector.
    ///   - indexId: The identifier of the index you want to use with the data source connector.
    ///   - languageCode: The code for a language. This allows you to support a language for all  documents when creating the data source connector. English is supported  by default. For more information on supported languages, including their codes,  see Adding  documents in languages other than English.
    ///   - name: A name for the data source connector.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission to access  the data source and required resources. For more information, see IAM access roles for Amazon Kendra.. You can't specify the RoleArn parameter when the Type parameter is set to CUSTOM. If you do, you receive a ValidationException exception. The RoleArn parameter is required for all other data sources.
    ///   - schedule: Sets the frequency for Amazon Kendra to check the documents in your data source repository and update the index. If you don't set a schedule Amazon Kendra will not periodically update the index. You can call the StartDataSourceSyncJob API to update the index. Specify a cron- format schedule string or an empty string to indicate that  the index is updated on demand. You can't specify the Schedule parameter when the Type parameter is set to CUSTOM. If you do, you receive a ValidationException exception.
    ///   - tags: A list of key-value pairs that identify or categorize the data source connector. You  can also use tags to help control access to the data source connector. Tag keys and values  can consist of Unicode letters, digits, white space, and any of the following symbols:  _ . : / = + - @.
    ///   - type: The type of data source repository. For example, SHAREPOINT.
    ///   - vpcConfiguration: Configuration information for an Amazon Virtual Private Cloud to connect to your data source. For more information, see Configuring a VPC.
    ///   - logger: Logger use during operation
    @inlinable
    public func createDataSource(
        clientToken: String? = CreateDataSourceRequest.idempotencyToken(),
        configuration: DataSourceConfiguration? = nil,
        customDocumentEnrichmentConfiguration: CustomDocumentEnrichmentConfiguration? = nil,
        description: String? = nil,
        indexId: String,
        languageCode: String? = nil,
        name: String,
        roleArn: String? = nil,
        schedule: String? = nil,
        tags: [Tag]? = nil,
        type: DataSourceType,
        vpcConfiguration: DataSourceVpcConfiguration? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateDataSourceResponse {
        let input = CreateDataSourceRequest(
            clientToken: clientToken, 
            configuration: configuration, 
            customDocumentEnrichmentConfiguration: customDocumentEnrichmentConfiguration, 
            description: description, 
            indexId: indexId, 
            languageCode: languageCode, 
            name: name, 
            roleArn: roleArn, 
            schedule: schedule, 
            tags: tags, 
            type: type, 
            vpcConfiguration: vpcConfiguration
        )
        return try await self.createDataSource(input, logger: logger)
    }

    /// Creates an Amazon Kendra experience such as a search application. For more information  on creating a search application experience, including using the Python and Java SDKs,  see Building a  search experience with no code.
    @Sendable
    @inlinable
    public func createExperience(_ input: CreateExperienceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateExperienceResponse {
        try await self.client.execute(
            operation: "CreateExperience", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an Amazon Kendra experience such as a search application. For more information  on creating a search application experience, including using the Python and Java SDKs,  see Building a  search experience with no code.
    ///
    /// Parameters:
    ///   - clientToken: A token that you provide to identify the request to create your Amazon Kendra experience. Multiple calls to the CreateExperience API with the same client  token creates only one Amazon Kendra experience.
    ///   - configuration: Configuration information for your Amazon Kendra experience. This includes ContentSourceConfiguration, which specifies the data source IDs  and/or FAQ IDs, and UserIdentityConfiguration, which specifies the  user or group information to grant access to your Amazon Kendra experience.
    ///   - description: A description for your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - name: A name for your Amazon Kendra experience.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission to access  Query API, GetQuerySuggestions API, and other required APIs.  The role also must include permission to access IAM Identity Center that stores your  user and group information. For more information, see IAM access roles for Amazon Kendra.
    ///   - logger: Logger use during operation
    @inlinable
    public func createExperience(
        clientToken: String? = CreateExperienceRequest.idempotencyToken(),
        configuration: ExperienceConfiguration? = nil,
        description: String? = nil,
        indexId: String,
        name: String,
        roleArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateExperienceResponse {
        let input = CreateExperienceRequest(
            clientToken: clientToken, 
            configuration: configuration, 
            description: description, 
            indexId: indexId, 
            name: name, 
            roleArn: roleArn
        )
        return try await self.createExperience(input, logger: logger)
    }

    /// Creates a set of frequently ask questions (FAQs) using a specified FAQ file stored  in an Amazon S3 bucket. Adding FAQs to an index is an asynchronous operation. For an example of adding an FAQ to an index using Python and Java SDKs, see Using your FAQ file.
    @Sendable
    @inlinable
    public func createFaq(_ input: CreateFaqRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateFaqResponse {
        try await self.client.execute(
            operation: "CreateFaq", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a set of frequently ask questions (FAQs) using a specified FAQ file stored  in an Amazon S3 bucket. Adding FAQs to an index is an asynchronous operation. For an example of adding an FAQ to an index using Python and Java SDKs, see Using your FAQ file.
    ///
    /// Parameters:
    ///   - clientToken: A token that you provide to identify the request to create a FAQ. Multiple calls to the CreateFaqRequest API with the same client token will create only one FAQ.
    ///   - description: A description for the FAQ.
    ///   - fileFormat: The format of the FAQ input file. You can choose between a basic CSV format, a CSV format that includes customs attributes in a header, and a JSON format that includes custom attributes. The default format is CSV. The format must match the format of the file stored in the S3 bucket identified in  the S3Path parameter. For more information, see Adding questions and answers.
    ///   - indexId: The identifier of the index for the FAQ.
    ///   - languageCode: The code for a language. This allows you to support a language  for the FAQ document. English is supported by default.  For more information on supported languages, including their codes,  see Adding  documents in languages other than English.
    ///   - name: A name for the FAQ.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission to access  the S3 bucket that contains the FAQ file. For more information, see IAM access roles for  Amazon Kendra.
    ///   - s3Path: The path to the FAQ file in S3.
    ///   - tags: A list of key-value pairs that identify the FAQ. You can use the tags to identify and organize your resources and to control access to resources.
    ///   - logger: Logger use during operation
    @inlinable
    public func createFaq(
        clientToken: String? = CreateFaqRequest.idempotencyToken(),
        description: String? = nil,
        fileFormat: FaqFileFormat? = nil,
        indexId: String,
        languageCode: String? = nil,
        name: String,
        roleArn: String,
        s3Path: S3Path,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateFaqResponse {
        let input = CreateFaqRequest(
            clientToken: clientToken, 
            description: description, 
            fileFormat: fileFormat, 
            indexId: indexId, 
            languageCode: languageCode, 
            name: name, 
            roleArn: roleArn, 
            s3Path: s3Path, 
            tags: tags
        )
        return try await self.createFaq(input, logger: logger)
    }

    /// Creates a set of featured results to display at the top of the search results page. Featured results are placed above all other results for certain queries. You map  specific queries to specific documents for featuring in the results. If a query  contains an exact match, then one or more specific documents are featured in the  search results. You can create up to 50 sets of featured results per index. You can request to  increase this limit by contacting Support.
    @Sendable
    @inlinable
    public func createFeaturedResultsSet(_ input: CreateFeaturedResultsSetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateFeaturedResultsSetResponse {
        try await self.client.execute(
            operation: "CreateFeaturedResultsSet", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a set of featured results to display at the top of the search results page. Featured results are placed above all other results for certain queries. You map  specific queries to specific documents for featuring in the results. If a query  contains an exact match, then one or more specific documents are featured in the  search results. You can create up to 50 sets of featured results per index. You can request to  increase this limit by contacting Support.
    ///
    /// Parameters:
    ///   - clientToken: A token that you provide to identify the request to create a set of  featured results. Multiple calls to the CreateFeaturedResultsSet  API with the same client token will create only one featured results set.
    ///   - description: A description for the set of featured results.
    ///   - featuredDocuments: A list of document IDs for the documents you want to feature at the  top of the search results page. For more information on the list of  documents, see FeaturedResultsSet.
    ///   - featuredResultsSetName: A name for the set of featured results.
    ///   - indexId: The identifier of the index that you want to use for featuring results.
    ///   - queryTexts: A list of queries for featuring results. For more information on the  list of queries, see FeaturedResultsSet.
    ///   - status: The current status of the set of featured results. When the value is  ACTIVE, featured results are ready for use. You can still  configure your settings before setting the status to ACTIVE.  You can set the status to ACTIVE or INACTIVE  using the UpdateFeaturedResultsSet API. The queries you specify for  featured results must be unique per featured results set for each index,  whether the status is ACTIVE or INACTIVE.
    ///   - tags: A list of key-value pairs that identify or categorize the featured results set. You can also use tags to help control access to the featured results set. Tag keys and values can consist of Unicode letters, digits, white space, and any of the following symbols:_ . : / = + - @.
    ///   - logger: Logger use during operation
    @inlinable
    public func createFeaturedResultsSet(
        clientToken: String? = nil,
        description: String? = nil,
        featuredDocuments: [FeaturedDocument]? = nil,
        featuredResultsSetName: String,
        indexId: String,
        queryTexts: [String]? = nil,
        status: FeaturedResultsSetStatus? = nil,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateFeaturedResultsSetResponse {
        let input = CreateFeaturedResultsSetRequest(
            clientToken: clientToken, 
            description: description, 
            featuredDocuments: featuredDocuments, 
            featuredResultsSetName: featuredResultsSetName, 
            indexId: indexId, 
            queryTexts: queryTexts, 
            status: status, 
            tags: tags
        )
        return try await self.createFeaturedResultsSet(input, logger: logger)
    }

    /// Creates an Amazon Kendra index. Index creation is an asynchronous API. To determine if index creation has completed, check the Status field returned from a call to DescribeIndex. The Status field is set to ACTIVE when the index is ready to use. Once the index is active, you can index your documents using the BatchPutDocument API or using one of the supported data sources. For an example of creating an index and data source using the Python SDK, see Getting started with Python SDK. For an example of creating an index and data source using the Java SDK, see Getting started with Java SDK.
    @Sendable
    @inlinable
    public func createIndex(_ input: CreateIndexRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateIndexResponse {
        try await self.client.execute(
            operation: "CreateIndex", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an Amazon Kendra index. Index creation is an asynchronous API. To determine if index creation has completed, check the Status field returned from a call to DescribeIndex. The Status field is set to ACTIVE when the index is ready to use. Once the index is active, you can index your documents using the BatchPutDocument API or using one of the supported data sources. For an example of creating an index and data source using the Python SDK, see Getting started with Python SDK. For an example of creating an index and data source using the Java SDK, see Getting started with Java SDK.
    ///
    /// Parameters:
    ///   - clientToken: A token that you provide to identify the request to create an index. Multiple calls to the CreateIndex API with the same client token will create only one index.
    ///   - description: A description for the index.
    ///   - edition: The Amazon Kendra edition to use for the index. Choose DEVELOPER_EDITION for indexes intended for development, testing, or proof of concept. Use ENTERPRISE_EDITION for production. Use GEN_AI_ENTERPRISE_EDITION for creating generative AI applications. Once you set the edition for an index, it can't be changed.  The Edition parameter is optional. If you don't supply a value, the default is ENTERPRISE_EDITION. For more information on quota limits for Gen AI Enterprise Edition, Enterprise Edition, and Developer Edition indices, see Quotas.
    ///   - name: A name for the index.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission to access your Amazon CloudWatch logs and metrics. For more information, see IAM access roles for Amazon Kendra.
    ///   - serverSideEncryptionConfiguration: The identifier of the KMS customer managed key (CMK) that's used to encrypt data indexed by Amazon Kendra. Amazon Kendra doesn't support asymmetric CMKs.
    ///   - tags: A list of key-value pairs that identify or categorize the index. You can also use tags to help control access to the index. Tag keys and values can consist of Unicode letters, digits, white space, and any of the following symbols: _ . : / = + - @.
    ///   - userContextPolicy: The user context policy.  If you're using an Amazon Kendra Gen AI Enterprise Edition index, you can only use ATTRIBUTE_FILTER to filter search results by user context. If you're using an Amazon Kendra Gen AI Enterprise Edition index and you try to use USER_TOKEN to configure user context policy, Amazon Kendra returns a ValidationException error.   ATTRIBUTE_FILTER  All indexed content is searchable and displayable for all users. If you want to filter search results on user context, you can use the attribute filters of _user_id and _group_ids or you can provide user and group information in UserContext.   USER_TOKEN  Enables token-based user access control to filter search results on user context. All documents with no access control and all documents accessible to the user will be searchable and displayable.
    ///   - userGroupResolutionConfiguration: Gets users and groups from IAM Identity Center identity source. To configure this, see UserGroupResolutionConfiguration. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.  If you're using an Amazon Kendra Gen AI Enterprise Edition index, UserGroupResolutionConfiguration isn't supported.
    ///   - userTokenConfigurations: The user token configuration.  If you're using an Amazon Kendra Gen AI Enterprise Edition index and you try to use UserTokenConfigurations to configure user context policy, Amazon Kendra returns a ValidationException error.
    ///   - logger: Logger use during operation
    @inlinable
    public func createIndex(
        clientToken: String? = CreateIndexRequest.idempotencyToken(),
        description: String? = nil,
        edition: IndexEdition? = nil,
        name: String,
        roleArn: String,
        serverSideEncryptionConfiguration: ServerSideEncryptionConfiguration? = nil,
        tags: [Tag]? = nil,
        userContextPolicy: UserContextPolicy? = nil,
        userGroupResolutionConfiguration: UserGroupResolutionConfiguration? = nil,
        userTokenConfigurations: [UserTokenConfiguration]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateIndexResponse {
        let input = CreateIndexRequest(
            clientToken: clientToken, 
            description: description, 
            edition: edition, 
            name: name, 
            roleArn: roleArn, 
            serverSideEncryptionConfiguration: serverSideEncryptionConfiguration, 
            tags: tags, 
            userContextPolicy: userContextPolicy, 
            userGroupResolutionConfiguration: userGroupResolutionConfiguration, 
            userTokenConfigurations: userTokenConfigurations
        )
        return try await self.createIndex(input, logger: logger)
    }

    /// Creates a block list to exlcude certain queries from suggestions. Any query that contains words or phrases specified in the block  list is blocked or filtered out from being shown as a suggestion. You need to provide the file location of your block list text file  in your S3 bucket. In your text file, enter each block word or phrase  on a separate line. For information on the current quota limits for block lists, see  Quotas  for Amazon Kendra.  CreateQuerySuggestionsBlockList is currently not supported in the  Amazon Web Services GovCloud (US-West) region. For an example of creating a block list for query suggestions using the  Python SDK, see Query  suggestions block list.
    @Sendable
    @inlinable
    public func createQuerySuggestionsBlockList(_ input: CreateQuerySuggestionsBlockListRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateQuerySuggestionsBlockListResponse {
        try await self.client.execute(
            operation: "CreateQuerySuggestionsBlockList", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a block list to exlcude certain queries from suggestions. Any query that contains words or phrases specified in the block  list is blocked or filtered out from being shown as a suggestion. You need to provide the file location of your block list text file  in your S3 bucket. In your text file, enter each block word or phrase  on a separate line. For information on the current quota limits for block lists, see  Quotas  for Amazon Kendra.  CreateQuerySuggestionsBlockList is currently not supported in the  Amazon Web Services GovCloud (US-West) region. For an example of creating a block list for query suggestions using the  Python SDK, see Query  suggestions block list.
    ///
    /// Parameters:
    ///   - clientToken: A token that you provide to identify the request to create a  query suggestions block list.
    ///   - description: A description for the block list. For example, the description "List of all offensive words that can  appear in user queries and need to be blocked from suggestions."
    ///   - indexId: The identifier of the index you want to create a query suggestions block list for.
    ///   - name: A name for the block list. For example, the name 'offensive-words', which includes all  offensive words that could appear in user queries and need to be  blocked from suggestions.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission to  access your S3 bucket that contains the block list text file. For more information,  see IAM access roles for  Amazon Kendra.
    ///   - sourceS3Path: The S3 path to your block list text file in your S3 bucket. Each block word or phrase should be on a separate line in a text file. For information on the current quota limits for block lists, see  Quotas  for Amazon Kendra.
    ///   - tags: A list of key-value pairs that identify or categorize the block list.  Tag keys and values can consist of Unicode letters, digits, white space,  and any of the following symbols: _ . : / = + - @.
    ///   - logger: Logger use during operation
    @inlinable
    public func createQuerySuggestionsBlockList(
        clientToken: String? = CreateQuerySuggestionsBlockListRequest.idempotencyToken(),
        description: String? = nil,
        indexId: String,
        name: String,
        roleArn: String,
        sourceS3Path: S3Path,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateQuerySuggestionsBlockListResponse {
        let input = CreateQuerySuggestionsBlockListRequest(
            clientToken: clientToken, 
            description: description, 
            indexId: indexId, 
            name: name, 
            roleArn: roleArn, 
            sourceS3Path: sourceS3Path, 
            tags: tags
        )
        return try await self.createQuerySuggestionsBlockList(input, logger: logger)
    }

    /// Creates a thesaurus for an index. The thesaurus contains a list of synonyms in Solr format. For an example of adding a thesaurus file to an index, see  Adding  custom synonyms to an index.
    @Sendable
    @inlinable
    public func createThesaurus(_ input: CreateThesaurusRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateThesaurusResponse {
        try await self.client.execute(
            operation: "CreateThesaurus", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a thesaurus for an index. The thesaurus contains a list of synonyms in Solr format. For an example of adding a thesaurus file to an index, see  Adding  custom synonyms to an index.
    ///
    /// Parameters:
    ///   - clientToken: A token that you provide to identify the request to create a  thesaurus. Multiple calls to the CreateThesaurus API  with the same client token will create only one thesaurus.
    ///   - description: A description for the thesaurus.
    ///   - indexId: The identifier of the index for the thesaurus.
    ///   - name: A name for the thesaurus.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission  to access your S3 bucket that contains the thesaurus file. For more information,  see IAM  access roles for Amazon Kendra.
    ///   - sourceS3Path: The path to the thesaurus file in S3.
    ///   - tags: A list of key-value pairs that identify or categorize the thesaurus. You can  also use tags to help control access to the thesaurus. Tag keys and values can  consist of Unicode letters, digits, white space, and any of the following  symbols: _ . : / = + - @.
    ///   - logger: Logger use during operation
    @inlinable
    public func createThesaurus(
        clientToken: String? = CreateThesaurusRequest.idempotencyToken(),
        description: String? = nil,
        indexId: String,
        name: String,
        roleArn: String,
        sourceS3Path: S3Path,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateThesaurusResponse {
        let input = CreateThesaurusRequest(
            clientToken: clientToken, 
            description: description, 
            indexId: indexId, 
            name: name, 
            roleArn: roleArn, 
            sourceS3Path: sourceS3Path, 
            tags: tags
        )
        return try await self.createThesaurus(input, logger: logger)
    }

    /// Deletes an access control configuration that you created for your documents in an index. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.
    @Sendable
    @inlinable
    public func deleteAccessControlConfiguration(_ input: DeleteAccessControlConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAccessControlConfigurationResponse {
        try await self.client.execute(
            operation: "DeleteAccessControlConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an access control configuration that you created for your documents in an index. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.
    ///
    /// Parameters:
    ///   - id: The identifier of the access control configuration you want to delete.
    ///   - indexId: The identifier of the index for an access control configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAccessControlConfiguration(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAccessControlConfigurationResponse {
        let input = DeleteAccessControlConfigurationRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.deleteAccessControlConfiguration(input, logger: logger)
    }

    /// Deletes an Amazon Kendra data source connector. An exception is not thrown if the data source is already being deleted. While the data source is being deleted, the Status field returned by a call to the DescribeDataSource API is set to DELETING. For more information, see Deleting Data Sources. Deleting an entire data source or re-syncing your index after deleting specific documents  from a data source could take up to an hour or more, depending on the number of documents you  want to delete.
    @Sendable
    @inlinable
    public func deleteDataSource(_ input: DeleteDataSourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "DeleteDataSource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an Amazon Kendra data source connector. An exception is not thrown if the data source is already being deleted. While the data source is being deleted, the Status field returned by a call to the DescribeDataSource API is set to DELETING. For more information, see Deleting Data Sources. Deleting an entire data source or re-syncing your index after deleting specific documents  from a data source could take up to an hour or more, depending on the number of documents you  want to delete.
    ///
    /// Parameters:
    ///   - id: The identifier of the data source connector you want to delete.
    ///   - indexId: The identifier of the index used with the data source connector.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteDataSource(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = DeleteDataSourceRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.deleteDataSource(input, logger: logger)
    }

    /// Deletes your Amazon Kendra experience such as a search application. For more information on creating a search application experience, see Building a search experience with no code.
    @Sendable
    @inlinable
    public func deleteExperience(_ input: DeleteExperienceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteExperienceResponse {
        try await self.client.execute(
            operation: "DeleteExperience", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes your Amazon Kendra experience such as a search application. For more information on creating a search application experience, see Building a search experience with no code.
    ///
    /// Parameters:
    ///   - id: The identifier of your Amazon Kendra experience you want to delete.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteExperience(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteExperienceResponse {
        let input = DeleteExperienceRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.deleteExperience(input, logger: logger)
    }

    /// Removes a FAQ from an index.
    @Sendable
    @inlinable
    public func deleteFaq(_ input: DeleteFaqRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "DeleteFaq", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes a FAQ from an index.
    ///
    /// Parameters:
    ///   - id: The identifier of the FAQ you want to remove.
    ///   - indexId: The identifier of the index for the FAQ.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteFaq(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = DeleteFaqRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.deleteFaq(input, logger: logger)
    }

    /// Deletes an Amazon Kendra index. An exception is not thrown if the index is already being deleted. While the index is being deleted, the Status field returned by a call to the DescribeIndex API is set to DELETING.
    @Sendable
    @inlinable
    public func deleteIndex(_ input: DeleteIndexRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "DeleteIndex", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an Amazon Kendra index. An exception is not thrown if the index is already being deleted. While the index is being deleted, the Status field returned by a call to the DescribeIndex API is set to DELETING.
    ///
    /// Parameters:
    ///   - id: The identifier of the index you want to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteIndex(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = DeleteIndexRequest(
            id: id
        )
        return try await self.deleteIndex(input, logger: logger)
    }

    /// Deletes a group so that all users that belong to the group can no longer access documents only available to that group. For example, after deleting the group "Summer Interns", all interns who belonged to that group no longer see intern-only documents in their search results. If you want to delete or replace users or sub groups of a group, you need to use the PutPrincipalMapping operation. For example, if a user in the group "Engineering" leaves the engineering team and another user takes their place, you provide an updated list of users or sub groups that belong to the "Engineering" group when calling PutPrincipalMapping. You can update your internal list of users or sub groups and input this list when calling PutPrincipalMapping.  DeletePrincipalMapping is currently not supported in the Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func deletePrincipalMapping(_ input: DeletePrincipalMappingRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "DeletePrincipalMapping", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a group so that all users that belong to the group can no longer access documents only available to that group. For example, after deleting the group "Summer Interns", all interns who belonged to that group no longer see intern-only documents in their search results. If you want to delete or replace users or sub groups of a group, you need to use the PutPrincipalMapping operation. For example, if a user in the group "Engineering" leaves the engineering team and another user takes their place, you provide an updated list of users or sub groups that belong to the "Engineering" group when calling PutPrincipalMapping. You can update your internal list of users or sub groups and input this list when calling PutPrincipalMapping.  DeletePrincipalMapping is currently not supported in the Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - dataSourceId: The identifier of the data source you want to delete a group from. A group can be tied to multiple data sources. You can delete a group from accessing documents in a certain data source. For example, the groups "Research", "Engineering", and "Sales and Marketing" are all tied to the company's documents stored in the data sources Confluence and Salesforce. You want to delete "Research" and "Engineering" groups from Salesforce, so that these groups cannot access customer-related documents stored in Salesforce. Only "Sales and Marketing" should access documents in the Salesforce data source.
    ///   - groupId: The identifier of the group you want to delete.
    ///   - indexId: The identifier of the index you want to delete a group from.
    ///   - orderingId: The timestamp identifier you specify to ensure Amazon Kendra does not override the latest DELETE action with previous actions. The highest number ID, which is the ordering ID, is the latest action you want to process and apply on top of other actions with lower number IDs. This prevents previous actions with lower number IDs from possibly overriding the latest action. The ordering ID can be the Unix time of the last update you made to a group members list. You would then provide this list when calling PutPrincipalMapping. This ensures your DELETE action for that updated group with the latest members list doesn't get overwritten by earlier DELETE actions for the same group which are yet to be processed. The default ordering ID is the current Unix time in milliseconds that the action was received by Amazon Kendra.
    ///   - logger: Logger use during operation
    @inlinable
    public func deletePrincipalMapping(
        dataSourceId: String? = nil,
        groupId: String,
        indexId: String,
        orderingId: Int64? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = DeletePrincipalMappingRequest(
            dataSourceId: dataSourceId, 
            groupId: groupId, 
            indexId: indexId, 
            orderingId: orderingId
        )
        return try await self.deletePrincipalMapping(input, logger: logger)
    }

    /// Deletes a block list used for query suggestions for an index. A deleted block list might not take effect right away. Amazon Kendra  needs to refresh the entire suggestions list to add back the  queries that were previously blocked.  DeleteQuerySuggestionsBlockList is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func deleteQuerySuggestionsBlockList(_ input: DeleteQuerySuggestionsBlockListRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "DeleteQuerySuggestionsBlockList", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a block list used for query suggestions for an index. A deleted block list might not take effect right away. Amazon Kendra  needs to refresh the entire suggestions list to add back the  queries that were previously blocked.  DeleteQuerySuggestionsBlockList is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - id: The identifier of the block list you want to delete.
    ///   - indexId: The identifier of the index for the block list.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteQuerySuggestionsBlockList(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = DeleteQuerySuggestionsBlockListRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.deleteQuerySuggestionsBlockList(input, logger: logger)
    }

    /// Deletes an Amazon Kendra thesaurus.
    @Sendable
    @inlinable
    public func deleteThesaurus(_ input: DeleteThesaurusRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "DeleteThesaurus", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an Amazon Kendra thesaurus.
    ///
    /// Parameters:
    ///   - id: The identifier of the thesaurus you want to delete.
    ///   - indexId: The identifier of the index for the thesaurus.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteThesaurus(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = DeleteThesaurusRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.deleteThesaurus(input, logger: logger)
    }

    /// Gets information about an access control configuration that you created for your documents in an index. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.
    @Sendable
    @inlinable
    public func describeAccessControlConfiguration(_ input: DescribeAccessControlConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeAccessControlConfigurationResponse {
        try await self.client.execute(
            operation: "DescribeAccessControlConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about an access control configuration that you created for your documents in an index. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.
    ///
    /// Parameters:
    ///   - id: The identifier of the access control configuration you want to get information on.
    ///   - indexId: The identifier of the index for an access control configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeAccessControlConfiguration(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeAccessControlConfigurationResponse {
        let input = DescribeAccessControlConfigurationRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.describeAccessControlConfiguration(input, logger: logger)
    }

    /// Gets information about an Amazon Kendra data source connector.
    @Sendable
    @inlinable
    public func describeDataSource(_ input: DescribeDataSourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeDataSourceResponse {
        try await self.client.execute(
            operation: "DescribeDataSource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about an Amazon Kendra data source connector.
    ///
    /// Parameters:
    ///   - id: The identifier of the data source connector.
    ///   - indexId: The identifier of the index used with the data source connector.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeDataSource(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeDataSourceResponse {
        let input = DescribeDataSourceRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.describeDataSource(input, logger: logger)
    }

    /// Gets information about your Amazon Kendra experience such as a search application.  For more information on creating a search application experience,  see Building  a search experience with no code.
    @Sendable
    @inlinable
    public func describeExperience(_ input: DescribeExperienceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeExperienceResponse {
        try await self.client.execute(
            operation: "DescribeExperience", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about your Amazon Kendra experience such as a search application.  For more information on creating a search application experience,  see Building  a search experience with no code.
    ///
    /// Parameters:
    ///   - id: The identifier of your Amazon Kendra experience you want to get information on.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeExperience(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeExperienceResponse {
        let input = DescribeExperienceRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.describeExperience(input, logger: logger)
    }

    /// Gets information about a FAQ.
    @Sendable
    @inlinable
    public func describeFaq(_ input: DescribeFaqRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeFaqResponse {
        try await self.client.execute(
            operation: "DescribeFaq", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about a FAQ.
    ///
    /// Parameters:
    ///   - id: The identifier of the FAQ you want to get information on.
    ///   - indexId: The identifier of the index for the FAQ.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeFaq(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeFaqResponse {
        let input = DescribeFaqRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.describeFaq(input, logger: logger)
    }

    /// Gets information about a set of featured results. Features results are placed above all other results for certain queries. If there's an exact match of a query,  then one or more specific documents are featured in the search results.
    @Sendable
    @inlinable
    public func describeFeaturedResultsSet(_ input: DescribeFeaturedResultsSetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeFeaturedResultsSetResponse {
        try await self.client.execute(
            operation: "DescribeFeaturedResultsSet", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about a set of featured results. Features results are placed above all other results for certain queries. If there's an exact match of a query,  then one or more specific documents are featured in the search results.
    ///
    /// Parameters:
    ///   - featuredResultsSetId: The identifier of the set of featured results that you want to get  information on.
    ///   - indexId: The identifier of the index used for featuring results.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeFeaturedResultsSet(
        featuredResultsSetId: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeFeaturedResultsSetResponse {
        let input = DescribeFeaturedResultsSetRequest(
            featuredResultsSetId: featuredResultsSetId, 
            indexId: indexId
        )
        return try await self.describeFeaturedResultsSet(input, logger: logger)
    }

    /// Gets information about an Amazon Kendra index.
    @Sendable
    @inlinable
    public func describeIndex(_ input: DescribeIndexRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeIndexResponse {
        try await self.client.execute(
            operation: "DescribeIndex", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about an Amazon Kendra index.
    ///
    /// Parameters:
    ///   - id: The identifier of the index you want to get information on.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeIndex(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeIndexResponse {
        let input = DescribeIndexRequest(
            id: id
        )
        return try await self.describeIndex(input, logger: logger)
    }

    /// Describes the processing of PUT and DELETE actions for mapping users to their groups. This includes information on the status of actions currently processing or yet to be processed, when actions were last updated, when actions were received by Amazon Kendra, the latest action that should process and apply after other actions, and useful error messages if an action could not be processed.  DescribePrincipalMapping is currently not supported in the Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func describePrincipalMapping(_ input: DescribePrincipalMappingRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribePrincipalMappingResponse {
        try await self.client.execute(
            operation: "DescribePrincipalMapping", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the processing of PUT and DELETE actions for mapping users to their groups. This includes information on the status of actions currently processing or yet to be processed, when actions were last updated, when actions were received by Amazon Kendra, the latest action that should process and apply after other actions, and useful error messages if an action could not be processed.  DescribePrincipalMapping is currently not supported in the Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - dataSourceId: The identifier of the data source to check the processing of PUT and DELETE actions for mapping users to their groups.
    ///   - groupId: The identifier of the group required to check the processing of PUT and DELETE actions for mapping users to their groups.
    ///   - indexId: The identifier of the index required to check the processing of PUT and DELETE actions for mapping users to their groups.
    ///   - logger: Logger use during operation
    @inlinable
    public func describePrincipalMapping(
        dataSourceId: String? = nil,
        groupId: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribePrincipalMappingResponse {
        let input = DescribePrincipalMappingRequest(
            dataSourceId: dataSourceId, 
            groupId: groupId, 
            indexId: indexId
        )
        return try await self.describePrincipalMapping(input, logger: logger)
    }

    /// Gets information about a block list used for query suggestions for  an index. This is used to check the current settings that are applied to a  block list.  DescribeQuerySuggestionsBlockList is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func describeQuerySuggestionsBlockList(_ input: DescribeQuerySuggestionsBlockListRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeQuerySuggestionsBlockListResponse {
        try await self.client.execute(
            operation: "DescribeQuerySuggestionsBlockList", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about a block list used for query suggestions for  an index. This is used to check the current settings that are applied to a  block list.  DescribeQuerySuggestionsBlockList is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - id: The identifier of the block list you want to get information on.
    ///   - indexId: The identifier of the index for the block list.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeQuerySuggestionsBlockList(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeQuerySuggestionsBlockListResponse {
        let input = DescribeQuerySuggestionsBlockListRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.describeQuerySuggestionsBlockList(input, logger: logger)
    }

    /// Gets information on the settings of query suggestions for an index. This is used to check the current settings applied  to query suggestions.  DescribeQuerySuggestionsConfig is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func describeQuerySuggestionsConfig(_ input: DescribeQuerySuggestionsConfigRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeQuerySuggestionsConfigResponse {
        try await self.client.execute(
            operation: "DescribeQuerySuggestionsConfig", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information on the settings of query suggestions for an index. This is used to check the current settings applied  to query suggestions.  DescribeQuerySuggestionsConfig is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index with query suggestions that you want to get  information on.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeQuerySuggestionsConfig(
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeQuerySuggestionsConfigResponse {
        let input = DescribeQuerySuggestionsConfigRequest(
            indexId: indexId
        )
        return try await self.describeQuerySuggestionsConfig(input, logger: logger)
    }

    /// Gets information about an Amazon Kendra thesaurus.
    @Sendable
    @inlinable
    public func describeThesaurus(_ input: DescribeThesaurusRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeThesaurusResponse {
        try await self.client.execute(
            operation: "DescribeThesaurus", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets information about an Amazon Kendra thesaurus.
    ///
    /// Parameters:
    ///   - id: The identifier of the thesaurus you want to get information on.
    ///   - indexId: The identifier of the index for the thesaurus.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeThesaurus(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeThesaurusResponse {
        let input = DescribeThesaurusRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.describeThesaurus(input, logger: logger)
    }

    /// Prevents users or groups in your IAM Identity Center identity source from accessing your Amazon Kendra experience. You can create an Amazon Kendra experience  such as a search application. For more information on creating a search  application experience, see Building  a search experience with no code.
    @Sendable
    @inlinable
    public func disassociateEntitiesFromExperience(_ input: DisassociateEntitiesFromExperienceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateEntitiesFromExperienceResponse {
        try await self.client.execute(
            operation: "DisassociateEntitiesFromExperience", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Prevents users or groups in your IAM Identity Center identity source from accessing your Amazon Kendra experience. You can create an Amazon Kendra experience  such as a search application. For more information on creating a search  application experience, see Building  a search experience with no code.
    ///
    /// Parameters:
    ///   - entityList: Lists users or groups in your IAM Identity Center identity source.
    ///   - id: The identifier of your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateEntitiesFromExperience(
        entityList: [EntityConfiguration],
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateEntitiesFromExperienceResponse {
        let input = DisassociateEntitiesFromExperienceRequest(
            entityList: entityList, 
            id: id, 
            indexId: indexId
        )
        return try await self.disassociateEntitiesFromExperience(input, logger: logger)
    }

    /// Removes the specific permissions of users or groups in your IAM Identity Center  identity source with access to your Amazon Kendra experience. You can create an Amazon Kendra  experience such as a search application. For more information on creating a  search application experience, see Building a  search experience with no code.
    @Sendable
    @inlinable
    public func disassociatePersonasFromEntities(_ input: DisassociatePersonasFromEntitiesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociatePersonasFromEntitiesResponse {
        try await self.client.execute(
            operation: "DisassociatePersonasFromEntities", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the specific permissions of users or groups in your IAM Identity Center  identity source with access to your Amazon Kendra experience. You can create an Amazon Kendra  experience such as a search application. For more information on creating a  search application experience, see Building a  search experience with no code.
    ///
    /// Parameters:
    ///   - entityIds: The identifiers of users or groups in your IAM Identity Center identity  source. For example, user IDs could be user emails.
    ///   - id: The identifier of your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociatePersonasFromEntities(
        entityIds: [String],
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociatePersonasFromEntitiesResponse {
        let input = DisassociatePersonasFromEntitiesRequest(
            entityIds: entityIds, 
            id: id, 
            indexId: indexId
        )
        return try await self.disassociatePersonasFromEntities(input, logger: logger)
    }

    /// Fetches the queries that are suggested to your users.  GetQuerySuggestions is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func getQuerySuggestions(_ input: GetQuerySuggestionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetQuerySuggestionsResponse {
        try await self.client.execute(
            operation: "GetQuerySuggestions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Fetches the queries that are suggested to your users.  GetQuerySuggestions is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - attributeSuggestionsConfig: Configuration information for the document fields/attributes that you  want to base query suggestions on.
    ///   - indexId: The identifier of the index you want to get query suggestions from.
    ///   - maxSuggestionsCount: The maximum number of query suggestions you want to show  to your users.
    ///   - queryText: The text of a user's query to generate query suggestions. A query is suggested if the query prefix matches  what a user starts to type as their query. Amazon Kendra does not show any suggestions if a user  types fewer than two characters or more than 60 characters.  A query must also have at least one search result and contain  at least one word of more than four characters.
    ///   - suggestionTypes: The suggestions type to base query suggestions on. The suggestion  types are query history or document fields/attributes. You can set  one type or the other. If you set query history as your suggestions type, Amazon Kendra  suggests queries relevant to your users based on popular queries in  the query history. If you set document fields/attributes as your suggestions type,  Amazon Kendra suggests queries relevant to your users based on the  contents of document fields.
    ///   - logger: Logger use during operation
    @inlinable
    public func getQuerySuggestions(
        attributeSuggestionsConfig: AttributeSuggestionsGetConfig? = nil,
        indexId: String,
        maxSuggestionsCount: Int? = nil,
        queryText: String,
        suggestionTypes: [SuggestionType]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetQuerySuggestionsResponse {
        let input = GetQuerySuggestionsRequest(
            attributeSuggestionsConfig: attributeSuggestionsConfig, 
            indexId: indexId, 
            maxSuggestionsCount: maxSuggestionsCount, 
            queryText: queryText, 
            suggestionTypes: suggestionTypes
        )
        return try await self.getQuerySuggestions(input, logger: logger)
    }

    /// Retrieves search metrics data. The data provides a snapshot of how your users interact with your search application and how effective the application is.
    @Sendable
    @inlinable
    public func getSnapshots(_ input: GetSnapshotsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetSnapshotsResponse {
        try await self.client.execute(
            operation: "GetSnapshots", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves search metrics data. The data provides a snapshot of how your users interact with your search application and how effective the application is.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index to get search metrics data.
    ///   - interval: The time interval or time window to get search metrics data. The time interval uses the time zone of your index. You can view data in the following time windows:    THIS_WEEK: The current week, starting on the Sunday and ending on the day before the current date.    ONE_WEEK_AGO: The previous week, starting on the Sunday and ending on the following Saturday.    TWO_WEEKS_AGO: The week before the previous week, starting on the Sunday and ending on the following Saturday.    THIS_MONTH: The current month, starting on the first day of the month and ending on the day before the current date.    ONE_MONTH_AGO: The previous month, starting on the first day of the month and ending on the last day of the month.    TWO_MONTHS_AGO: The month before the previous month, starting on the first day of the month and ending on last day of the month.
    ///   - maxResults: The maximum number of returned data for the metric.
    ///   - metricType: The metric you want to retrieve. You can specify only one metric per call. For more information about the metrics you can view, see Gaining insights with search analytics.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of search metrics data.
    ///   - logger: Logger use during operation
    @inlinable
    public func getSnapshots(
        indexId: String,
        interval: Interval,
        maxResults: Int? = nil,
        metricType: MetricType,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetSnapshotsResponse {
        let input = GetSnapshotsRequest(
            indexId: indexId, 
            interval: interval, 
            maxResults: maxResults, 
            metricType: metricType, 
            nextToken: nextToken
        )
        return try await self.getSnapshots(input, logger: logger)
    }

    /// Lists one or more access control configurations for an index. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.
    @Sendable
    @inlinable
    public func listAccessControlConfigurations(_ input: ListAccessControlConfigurationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAccessControlConfigurationsResponse {
        try await self.client.execute(
            operation: "ListAccessControlConfigurations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists one or more access control configurations for an index. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index for the access control configuration.
    ///   - maxResults: The maximum number of access control configurations to return.
    ///   - nextToken: If the previous response was incomplete (because there's more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of access control configurations.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAccessControlConfigurations(
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAccessControlConfigurationsResponse {
        let input = ListAccessControlConfigurationsRequest(
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listAccessControlConfigurations(input, logger: logger)
    }

    /// Gets statistics about synchronizing a data source connector.
    @Sendable
    @inlinable
    public func listDataSourceSyncJobs(_ input: ListDataSourceSyncJobsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListDataSourceSyncJobsResponse {
        try await self.client.execute(
            operation: "ListDataSourceSyncJobs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets statistics about synchronizing a data source connector.
    ///
    /// Parameters:
    ///   - id: The identifier of the data source connector.
    ///   - indexId: The identifier of the index used with the data source connector.
    ///   - maxResults: The maximum number of synchronization jobs to return in the response. If there are fewer results in the list, this response contains only the actual results.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of jobs.
    ///   - startTimeFilter: When specified, the synchronization jobs returned in the list are limited to jobs between the specified dates.
    ///   - statusFilter: Only returns synchronization jobs with the Status field equal to the specified status.
    ///   - logger: Logger use during operation
    @inlinable
    public func listDataSourceSyncJobs(
        id: String,
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        startTimeFilter: TimeRange? = nil,
        statusFilter: DataSourceSyncJobStatus? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListDataSourceSyncJobsResponse {
        let input = ListDataSourceSyncJobsRequest(
            id: id, 
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            startTimeFilter: startTimeFilter, 
            statusFilter: statusFilter
        )
        return try await self.listDataSourceSyncJobs(input, logger: logger)
    }

    /// Lists the data source connectors that you have created.
    @Sendable
    @inlinable
    public func listDataSources(_ input: ListDataSourcesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListDataSourcesResponse {
        try await self.client.execute(
            operation: "ListDataSources", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the data source connectors that you have created.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index used with one or more data source connectors.
    ///   - maxResults: The maximum number of data source connectors to return.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of data source connectors.
    ///   - logger: Logger use during operation
    @inlinable
    public func listDataSources(
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListDataSourcesResponse {
        let input = ListDataSourcesRequest(
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listDataSources(input, logger: logger)
    }

    /// Lists specific permissions of users and groups with access to your  Amazon Kendra experience.
    @Sendable
    @inlinable
    public func listEntityPersonas(_ input: ListEntityPersonasRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListEntityPersonasResponse {
        try await self.client.execute(
            operation: "ListEntityPersonas", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists specific permissions of users and groups with access to your  Amazon Kendra experience.
    ///
    /// Parameters:
    ///   - id: The identifier of your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - maxResults: The maximum number of returned users or groups.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination  token to retrieve the next set of users or groups.
    ///   - logger: Logger use during operation
    @inlinable
    public func listEntityPersonas(
        id: String,
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListEntityPersonasResponse {
        let input = ListEntityPersonasRequest(
            id: id, 
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listEntityPersonas(input, logger: logger)
    }

    /// Lists users or groups in your IAM Identity Center identity source that are  granted access to your Amazon Kendra experience. You can create an Amazon Kendra experience  such as a search application. For more information on creating a search  application experience, see Building  a search experience with no code.
    @Sendable
    @inlinable
    public func listExperienceEntities(_ input: ListExperienceEntitiesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListExperienceEntitiesResponse {
        try await self.client.execute(
            operation: "ListExperienceEntities", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists users or groups in your IAM Identity Center identity source that are  granted access to your Amazon Kendra experience. You can create an Amazon Kendra experience  such as a search application. For more information on creating a search  application experience, see Building  a search experience with no code.
    ///
    /// Parameters:
    ///   - id: The identifier of your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination  token to retrieve the next set of users or groups.
    ///   - logger: Logger use during operation
    @inlinable
    public func listExperienceEntities(
        id: String,
        indexId: String,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListExperienceEntitiesResponse {
        let input = ListExperienceEntitiesRequest(
            id: id, 
            indexId: indexId, 
            nextToken: nextToken
        )
        return try await self.listExperienceEntities(input, logger: logger)
    }

    /// Lists one or more Amazon Kendra experiences. You can create an Amazon Kendra experience such  as a search application. For more information on creating a search application  experience, see Building a  search experience with no code.
    @Sendable
    @inlinable
    public func listExperiences(_ input: ListExperiencesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListExperiencesResponse {
        try await self.client.execute(
            operation: "ListExperiences", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists one or more Amazon Kendra experiences. You can create an Amazon Kendra experience such  as a search application. For more information on creating a search application  experience, see Building a  search experience with no code.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - maxResults: The maximum number of returned Amazon Kendra experiences.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of Amazon Kendra experiences.
    ///   - logger: Logger use during operation
    @inlinable
    public func listExperiences(
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListExperiencesResponse {
        let input = ListExperiencesRequest(
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listExperiences(input, logger: logger)
    }

    /// Gets a list of FAQs associated with an index.
    @Sendable
    @inlinable
    public func listFaqs(_ input: ListFaqsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListFaqsResponse {
        try await self.client.execute(
            operation: "ListFaqs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets a list of FAQs associated with an index.
    ///
    /// Parameters:
    ///   - indexId: The index for the FAQs.
    ///   - maxResults: The maximum number of FAQs to return in the response. If there are fewer results in the list, this response contains only the actual results.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of FAQs.
    ///   - logger: Logger use during operation
    @inlinable
    public func listFaqs(
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListFaqsResponse {
        let input = ListFaqsRequest(
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listFaqs(input, logger: logger)
    }

    /// Lists all your sets of featured results for a given index. Features results  are placed above all other results for certain queries. If there's an exact match  of a query, then one or more specific documents are featured in the search results.
    @Sendable
    @inlinable
    public func listFeaturedResultsSets(_ input: ListFeaturedResultsSetsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListFeaturedResultsSetsResponse {
        try await self.client.execute(
            operation: "ListFeaturedResultsSets", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all your sets of featured results for a given index. Features results  are placed above all other results for certain queries. If there's an exact match  of a query, then one or more specific documents are featured in the search results.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index used for featuring results.
    ///   - maxResults: The maximum number of featured results sets to return.
    ///   - nextToken: If the response is truncated, Amazon Kendra returns a pagination token  in the response. You can use this pagination token to retrieve the next set  of featured results sets.
    ///   - logger: Logger use during operation
    @inlinable
    public func listFeaturedResultsSets(
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListFeaturedResultsSetsResponse {
        let input = ListFeaturedResultsSetsRequest(
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listFeaturedResultsSets(input, logger: logger)
    }

    /// Provides a list of groups that are mapped to users before a given ordering or timestamp identifier.  ListGroupsOlderThanOrderingId is currently not supported in the Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func listGroupsOlderThanOrderingId(_ input: ListGroupsOlderThanOrderingIdRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListGroupsOlderThanOrderingIdResponse {
        try await self.client.execute(
            operation: "ListGroupsOlderThanOrderingId", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides a list of groups that are mapped to users before a given ordering or timestamp identifier.  ListGroupsOlderThanOrderingId is currently not supported in the Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - dataSourceId: The identifier of the data source for getting a list of groups mapped to users before a given ordering timestamp identifier.
    ///   - indexId: The identifier of the index for getting a list of groups mapped to users before a given ordering or timestamp identifier.
    ///   - maxResults:  The maximum number of returned groups that are mapped to users before a given ordering or timestamp identifier.
    ///   - nextToken:  If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of groups that are mapped to users before a given ordering or timestamp identifier.
    ///   - orderingId: The timestamp identifier used for the latest PUT or DELETE action for mapping users to their groups.
    ///   - logger: Logger use during operation
    @inlinable
    public func listGroupsOlderThanOrderingId(
        dataSourceId: String? = nil,
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        orderingId: Int64,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListGroupsOlderThanOrderingIdResponse {
        let input = ListGroupsOlderThanOrderingIdRequest(
            dataSourceId: dataSourceId, 
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            orderingId: orderingId
        )
        return try await self.listGroupsOlderThanOrderingId(input, logger: logger)
    }

    /// Lists the Amazon Kendra indexes that you created.
    @Sendable
    @inlinable
    public func listIndices(_ input: ListIndicesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListIndicesResponse {
        try await self.client.execute(
            operation: "ListIndices", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the Amazon Kendra indexes that you created.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of indices to return.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of indexes.
    ///   - logger: Logger use during operation
    @inlinable
    public func listIndices(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListIndicesResponse {
        let input = ListIndicesRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listIndices(input, logger: logger)
    }

    /// Lists the block lists used for query suggestions for an index. For information on the current quota limits for block lists, see  Quotas  for Amazon Kendra.  ListQuerySuggestionsBlockLists is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func listQuerySuggestionsBlockLists(_ input: ListQuerySuggestionsBlockListsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListQuerySuggestionsBlockListsResponse {
        try await self.client.execute(
            operation: "ListQuerySuggestionsBlockLists", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the block lists used for query suggestions for an index. For information on the current quota limits for block lists, see  Quotas  for Amazon Kendra.  ListQuerySuggestionsBlockLists is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index for a list of all block lists that exist for  that index. For information on the current quota limits for block lists, see  Quotas  for Amazon Kendra.
    ///   - maxResults: The maximum number of block lists to return.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve),  Amazon Kendra returns a pagination token in the response. You can use this pagination  token to retrieve the next set of block lists (BlockListSummaryItems).
    ///   - logger: Logger use during operation
    @inlinable
    public func listQuerySuggestionsBlockLists(
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListQuerySuggestionsBlockListsResponse {
        let input = ListQuerySuggestionsBlockListsRequest(
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listQuerySuggestionsBlockLists(input, logger: logger)
    }

    /// Gets a list of tags associated with a resource. Indexes, FAQs, data sources, and  other resources can have tags associated with them.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets a list of tags associated with a resource. Indexes, FAQs, data sources, and  other resources can have tags associated with them.
    ///
    /// Parameters:
    ///   - resourceARN: The Amazon Resource Name (ARN) of the index, FAQ, data source, or other resource to  get a list of tags for. For example, the ARN of an index is constructed as follows:  arn:aws:kendra:your-region:your-account-id:index/index-id  For information on how to construct an ARN for all types of Amazon Kendra resources, see  Resource  types.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceARN: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceARN: resourceARN
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Lists the thesauri for an index.
    @Sendable
    @inlinable
    public func listThesauri(_ input: ListThesauriRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListThesauriResponse {
        try await self.client.execute(
            operation: "ListThesauri", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the thesauri for an index.
    ///
    /// Parameters:
    ///   - indexId: The identifier of the index with one or more thesauri.
    ///   - maxResults: The maximum number of thesauri to return.
    ///   - nextToken: If the previous response was incomplete (because there is more data to retrieve), Amazon Kendra returns a pagination token in the response. You can use this pagination token to retrieve the next set of thesauri (ThesaurusSummaryItems).
    ///   - logger: Logger use during operation
    @inlinable
    public func listThesauri(
        indexId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListThesauriResponse {
        let input = ListThesauriRequest(
            indexId: indexId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listThesauri(input, logger: logger)
    }

    /// Maps users to their groups so that you only need to provide the user ID when you issue the query. You can also map sub groups to groups. For example, the group "Company Intellectual Property Teams" includes sub groups "Research" and "Engineering". These sub groups include their own list of users or people who work in these teams. Only users who work in research and engineering, and therefore belong in the intellectual property group, can see top-secret company documents in their search results. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents. For more information, see Filtering on user context. If more than five PUT actions for a group are currently processing, a validation exception is thrown.
    @Sendable
    @inlinable
    public func putPrincipalMapping(_ input: PutPrincipalMappingRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "PutPrincipalMapping", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Maps users to their groups so that you only need to provide the user ID when you issue the query. You can also map sub groups to groups. For example, the group "Company Intellectual Property Teams" includes sub groups "Research" and "Engineering". These sub groups include their own list of users or people who work in these teams. Only users who work in research and engineering, and therefore belong in the intellectual property group, can see top-secret company documents in their search results. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents. For more information, see Filtering on user context. If more than five PUT actions for a group are currently processing, a validation exception is thrown.
    ///
    /// Parameters:
    ///   - dataSourceId: The identifier of the data source you want to map users to their groups. This is useful if a group is tied to multiple data sources, but you only want the group to access documents of a certain data source. For example, the groups "Research", "Engineering", and "Sales and Marketing" are all tied to the company's documents stored in the data sources Confluence and Salesforce. However, "Sales and Marketing" team only needs access to customer-related documents stored in Salesforce.
    ///   - groupId: The identifier of the group you want to map its users to.
    ///   - groupMembers: The list that contains your users that belong the same group. This can include sub groups  that belong to a group. For example, the group "Company A" includes the user "CEO" and the sub groups "Research", "Engineering", and "Sales and Marketing". If you have more than 1000 users and/or sub groups for a single group, you need to provide the path to the S3 file that lists your users and sub groups for a group. Your sub groups can contain more than 1000 users, but the list of sub groups that belong to a group (and/or users) must be no more than 1000.
    ///   - indexId: The identifier of the index you want to map users to their groups.
    ///   - orderingId: The timestamp identifier you specify to ensure Amazon Kendra doesn't override the latest PUT action with previous actions. The highest number ID, which is the ordering ID, is the latest action you want to process and apply on top of other actions with lower number IDs. This prevents previous actions with lower number IDs from possibly overriding the latest action. The ordering ID can be the Unix time of the last update you made to a group members list. You would then provide this list when calling PutPrincipalMapping. This ensures your PUT action for that updated group with the latest members list doesn't get overwritten by earlier PUT actions for the same group which are yet to be processed. The default ordering ID is the current Unix time in milliseconds that the action was received by Amazon Kendra.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role that has access to the  S3 file that contains your list of users that belong to a group. For more information, see IAM roles for  Amazon Kendra.
    ///   - logger: Logger use during operation
    @inlinable
    public func putPrincipalMapping(
        dataSourceId: String? = nil,
        groupId: String,
        groupMembers: GroupMembers,
        indexId: String,
        orderingId: Int64? = nil,
        roleArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = PutPrincipalMappingRequest(
            dataSourceId: dataSourceId, 
            groupId: groupId, 
            groupMembers: groupMembers, 
            indexId: indexId, 
            orderingId: orderingId, 
            roleArn: roleArn
        )
        return try await self.putPrincipalMapping(input, logger: logger)
    }

    /// Searches an index given an input query.  If you are working with large language models (LLMs) or implementing retrieval augmented generation (RAG) systems, you can use Amazon Kendra's Retrieve API, which can return longer semantically relevant passages. We recommend using the Retrieve API instead of filing a service limit increase to increase the Query API document excerpt length.  You can configure boosting or relevance tuning at the query level to override boosting at the index level, filter based on document fields/attributes and faceted search, and filter based on the user or their group access to documents. You can also include certain fields in the response that might provide useful additional information. A query response contains three types of results.   Relevant suggested answers. The answers can be either a text excerpt or table excerpt. The answer can be highlighted in the excerpt.   Matching FAQs or questions-answer from your FAQ file.   Relevant documents. This result type includes an excerpt of the document with the document title. The searched terms can be highlighted in the excerpt.   You can specify that the query return only one type of result using the QueryResultTypeFilter parameter. Each query returns the 100 most relevant results. If you filter result type to only question-answers, a maximum of four results are returned. If you filter result type to only answers, a maximum of three results are returned.  If you're using an Amazon Kendra Gen AI Enterprise Edition index, you can only use ATTRIBUTE_FILTER to filter search results by user context. If you're using an Amazon Kendra Gen AI Enterprise Edition index and you try to use USER_TOKEN to configure user context policy, Amazon Kendra returns a ValidationException error.
    @Sendable
    @inlinable
    public func query(_ input: QueryRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> QueryResult {
        try await self.client.execute(
            operation: "Query", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Searches an index given an input query.  If you are working with large language models (LLMs) or implementing retrieval augmented generation (RAG) systems, you can use Amazon Kendra's Retrieve API, which can return longer semantically relevant passages. We recommend using the Retrieve API instead of filing a service limit increase to increase the Query API document excerpt length.  You can configure boosting or relevance tuning at the query level to override boosting at the index level, filter based on document fields/attributes and faceted search, and filter based on the user or their group access to documents. You can also include certain fields in the response that might provide useful additional information. A query response contains three types of results.   Relevant suggested answers. The answers can be either a text excerpt or table excerpt. The answer can be highlighted in the excerpt.   Matching FAQs or questions-answer from your FAQ file.   Relevant documents. This result type includes an excerpt of the document with the document title. The searched terms can be highlighted in the excerpt.   You can specify that the query return only one type of result using the QueryResultTypeFilter parameter. Each query returns the 100 most relevant results. If you filter result type to only question-answers, a maximum of four results are returned. If you filter result type to only answers, a maximum of three results are returned.  If you're using an Amazon Kendra Gen AI Enterprise Edition index, you can only use ATTRIBUTE_FILTER to filter search results by user context. If you're using an Amazon Kendra Gen AI Enterprise Edition index and you try to use USER_TOKEN to configure user context policy, Amazon Kendra returns a ValidationException error.
    ///
    /// Parameters:
    ///   - attributeFilter: Filters search results by document fields/attributes. You can only provide one attribute filter; however, the AndAllFilters, NotFilter, and OrAllFilters parameters contain a list of other filters. The AttributeFilter parameter means you can create a set of filtering rules that a document must satisfy to be included in the query results.  For Amazon Kendra Gen AI Enterprise Edition indices use AttributeFilter to enable document filtering for end users using _email_id or include public documents (_email_id=null).
    ///   - collapseConfiguration: Provides configuration to determine how to group results by document attribute value, and how to display them (collapsed or expanded) under a designated primary document for each group.
    ///   - documentRelevanceOverrideConfigurations: Overrides relevance tuning configurations of fields/attributes set at the index level. If you use this API to override the relevance tuning configured at the index level, but there is no relevance tuning configured at the index level, then Amazon Kendra does not apply any relevance tuning. If there is relevance tuning configured for fields at the index level, and you use this API to override only some of these fields, then for the fields you did not override, the importance is set to 1.
    ///   - facets: An array of documents fields/attributes for faceted search. Amazon Kendra returns a count for each field key specified. This helps your users narrow their search.
    ///   - indexId: The identifier of the index for the search.
    ///   - pageNumber: Query results are returned in pages the size of the PageSize parameter. By default, Amazon Kendra returns the first page of results. Use this parameter to get result pages after the first one.
    ///   - pageSize: Sets the number of results that are returned in each page of results. The default page size is 10. The maximum number of results returned is 100. If you ask for more than 100 results, only 100 are returned.
    ///   - queryResultTypeFilter: Sets the type of query result or response. Only results for the specified type are returned.
    ///   - queryText: The input query text for the search. Amazon Kendra truncates queries at 30 token words, which excludes punctuation and stop words. Truncation still applies if you use Boolean or more advanced, complex queries. For example, Timeoff AND October AND Category:HR is counted as 3 tokens: timeoff, october, hr. For more information, see Searching with advanced query syntax in the Amazon Kendra Developer Guide.
    ///   - requestedDocumentAttributes: An array of document fields/attributes to include in the response. You can limit the response to include certain document fields. By default, all document attributes are included in the response.
    ///   - sortingConfiguration: Provides information that determines how the results of the query are sorted. You can set the field that Amazon Kendra should sort the results on, and specify whether the results should be sorted in ascending or descending order. In the case of ties in sorting the results, the results are sorted by relevance. If you don't provide sorting configuration, the results are sorted by the relevance that Amazon Kendra determines for the result.
    ///   - sortingConfigurations: Provides configuration information to determine how the results of a query are sorted. You can set upto 3 fields that Amazon Kendra should sort the results on, and specify whether the results should be sorted in ascending or descending order. The sort field quota can be increased. If you don't provide a sorting configuration, the results are sorted by the relevance that Amazon Kendra determines for the result. In the case of ties in sorting the results, the results are sorted by relevance.
    ///   - spellCorrectionConfiguration: Enables suggested spell corrections for queries.
    ///   - userContext: The user context token or user and group information.
    ///   - visitorId: Provides an identifier for a specific user. The VisitorId should be a unique identifier, such as a GUID. Don't use personally identifiable information, such as the user's email address, as the VisitorId.
    ///   - logger: Logger use during operation
    @inlinable
    public func query(
        attributeFilter: AttributeFilter? = nil,
        collapseConfiguration: CollapseConfiguration? = nil,
        documentRelevanceOverrideConfigurations: [DocumentRelevanceConfiguration]? = nil,
        facets: [Facet]? = nil,
        indexId: String,
        pageNumber: Int? = nil,
        pageSize: Int? = nil,
        queryResultTypeFilter: QueryResultType? = nil,
        queryText: String? = nil,
        requestedDocumentAttributes: [String]? = nil,
        sortingConfiguration: SortingConfiguration? = nil,
        sortingConfigurations: [SortingConfiguration]? = nil,
        spellCorrectionConfiguration: SpellCorrectionConfiguration? = nil,
        userContext: UserContext? = nil,
        visitorId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> QueryResult {
        let input = QueryRequest(
            attributeFilter: attributeFilter, 
            collapseConfiguration: collapseConfiguration, 
            documentRelevanceOverrideConfigurations: documentRelevanceOverrideConfigurations, 
            facets: facets, 
            indexId: indexId, 
            pageNumber: pageNumber, 
            pageSize: pageSize, 
            queryResultTypeFilter: queryResultTypeFilter, 
            queryText: queryText, 
            requestedDocumentAttributes: requestedDocumentAttributes, 
            sortingConfiguration: sortingConfiguration, 
            sortingConfigurations: sortingConfigurations, 
            spellCorrectionConfiguration: spellCorrectionConfiguration, 
            userContext: userContext, 
            visitorId: visitorId
        )
        return try await self.query(input, logger: logger)
    }

    /// Retrieves relevant passages or text excerpts given an input query. This API is similar to the Query API. However, by default, the Query API only returns excerpt passages of up to 100 token words. With the Retrieve API, you can retrieve longer passages of up to 200 token words and up to 100 semantically relevant passages. This doesn't include question-answer or FAQ type responses from your index. The passages are text excerpts that can be semantically extracted from multiple documents and multiple parts of the same document. If in extreme cases your documents produce zero passages using the Retrieve API, you can alternatively use the Query API and its types of responses. You can also do the following:   Override boosting at the index level   Filter based on document fields or attributes   Filter based on the user or their group access to documents   View the confidence score bucket for a retrieved passage result. The confidence bucket provides a relative ranking that indicates how confident Amazon Kendra is that the response is relevant to the query.  Confidence score buckets are currently available only for English.    You can also include certain fields in the response that might provide useful additional information. The Retrieve API shares the number of query capacity units that you set for your index. For more information on what's included in a single capacity unit and the default base capacity for an index, see Adjusting capacity.  If you're using an Amazon Kendra Gen AI Enterprise Edition index, you can only use ATTRIBUTE_FILTER to filter search results by user context. If you're using an Amazon Kendra Gen AI Enterprise Edition index and you try to use USER_TOKEN to configure user context policy, Amazon Kendra returns a ValidationException error.
    @Sendable
    @inlinable
    public func retrieve(_ input: RetrieveRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> RetrieveResult {
        try await self.client.execute(
            operation: "Retrieve", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves relevant passages or text excerpts given an input query. This API is similar to the Query API. However, by default, the Query API only returns excerpt passages of up to 100 token words. With the Retrieve API, you can retrieve longer passages of up to 200 token words and up to 100 semantically relevant passages. This doesn't include question-answer or FAQ type responses from your index. The passages are text excerpts that can be semantically extracted from multiple documents and multiple parts of the same document. If in extreme cases your documents produce zero passages using the Retrieve API, you can alternatively use the Query API and its types of responses. You can also do the following:   Override boosting at the index level   Filter based on document fields or attributes   Filter based on the user or their group access to documents   View the confidence score bucket for a retrieved passage result. The confidence bucket provides a relative ranking that indicates how confident Amazon Kendra is that the response is relevant to the query.  Confidence score buckets are currently available only for English.    You can also include certain fields in the response that might provide useful additional information. The Retrieve API shares the number of query capacity units that you set for your index. For more information on what's included in a single capacity unit and the default base capacity for an index, see Adjusting capacity.  If you're using an Amazon Kendra Gen AI Enterprise Edition index, you can only use ATTRIBUTE_FILTER to filter search results by user context. If you're using an Amazon Kendra Gen AI Enterprise Edition index and you try to use USER_TOKEN to configure user context policy, Amazon Kendra returns a ValidationException error.
    ///
    /// Parameters:
    ///   - attributeFilter: Filters search results by document fields/attributes. You can only provide one attribute filter; however, the AndAllFilters, NotFilter, and OrAllFilters parameters contain a list of other filters. The AttributeFilter parameter means you can create a set of filtering rules that a document must satisfy to be included in the query results.  For Amazon Kendra Gen AI Enterprise Edition indices use AttributeFilter to enable document filtering for end users using _email_id or include public documents (_email_id=null).
    ///   - documentRelevanceOverrideConfigurations: Overrides relevance tuning configurations of fields/attributes set at the index level. If you use this API to override the relevance tuning configured at the index level, but there is no relevance tuning configured at the index level, then Amazon Kendra does not apply any relevance tuning. If there is relevance tuning configured for fields at the index level, and you use this API to override only some of these fields, then for the fields you did not override, the importance is set to 1.
    ///   - indexId: The identifier of the index to retrieve relevant passages for the search.
    ///   - pageNumber: Retrieved relevant passages are returned in pages the size of the PageSize parameter. By default, Amazon Kendra returns the first page of results. Use this parameter to get result pages after the first one.
    ///   - pageSize: Sets the number of retrieved relevant passages that are returned in each page of results. The default page size is 10. The maximum number of results returned is 100. If you ask for more than 100 results, only 100 are returned.
    ///   - queryText: The input query text to retrieve relevant passages for the search. Amazon Kendra truncates queries at 30 token words, which excludes punctuation and stop words. Truncation still applies if you use Boolean or more advanced, complex queries. For example, Timeoff AND October AND Category:HR is counted as 3 tokens: timeoff, october, hr. For more information, see Searching with advanced query syntax in the Amazon Kendra Developer Guide.
    ///   - requestedDocumentAttributes: A list of document fields/attributes to include in the response. You can limit the response to include certain document fields. By default, all document fields are included in the response.
    ///   - userContext: The user context token or user and group information.
    ///   - logger: Logger use during operation
    @inlinable
    public func retrieve(
        attributeFilter: AttributeFilter? = nil,
        documentRelevanceOverrideConfigurations: [DocumentRelevanceConfiguration]? = nil,
        indexId: String,
        pageNumber: Int? = nil,
        pageSize: Int? = nil,
        queryText: String,
        requestedDocumentAttributes: [String]? = nil,
        userContext: UserContext? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> RetrieveResult {
        let input = RetrieveRequest(
            attributeFilter: attributeFilter, 
            documentRelevanceOverrideConfigurations: documentRelevanceOverrideConfigurations, 
            indexId: indexId, 
            pageNumber: pageNumber, 
            pageSize: pageSize, 
            queryText: queryText, 
            requestedDocumentAttributes: requestedDocumentAttributes, 
            userContext: userContext
        )
        return try await self.retrieve(input, logger: logger)
    }

    /// Starts a synchronization job for a data source connector. If a synchronization job is already in progress, Amazon Kendra returns a ResourceInUseException exception. Re-syncing your data source with your index after modifying, adding, or deleting  documents from your data source respository could take up to an hour or more, depending on  the number of documents to sync.
    @Sendable
    @inlinable
    public func startDataSourceSyncJob(_ input: StartDataSourceSyncJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartDataSourceSyncJobResponse {
        try await self.client.execute(
            operation: "StartDataSourceSyncJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts a synchronization job for a data source connector. If a synchronization job is already in progress, Amazon Kendra returns a ResourceInUseException exception. Re-syncing your data source with your index after modifying, adding, or deleting  documents from your data source respository could take up to an hour or more, depending on  the number of documents to sync.
    ///
    /// Parameters:
    ///   - id: The identifier of the data source connector to synchronize.
    ///   - indexId: The identifier of the index used with the data source connector.
    ///   - logger: Logger use during operation
    @inlinable
    public func startDataSourceSyncJob(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartDataSourceSyncJobResponse {
        let input = StartDataSourceSyncJobRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.startDataSourceSyncJob(input, logger: logger)
    }

    /// Stops a synchronization job that is currently running. You can't stop a scheduled synchronization job.
    @Sendable
    @inlinable
    public func stopDataSourceSyncJob(_ input: StopDataSourceSyncJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "StopDataSourceSyncJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops a synchronization job that is currently running. You can't stop a scheduled synchronization job.
    ///
    /// Parameters:
    ///   - id: The identifier of the data source connector for which to stop the synchronization jobs.
    ///   - indexId: The identifier of the index used with the data source connector.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopDataSourceSyncJob(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = StopDataSourceSyncJobRequest(
            id: id, 
            indexId: indexId
        )
        return try await self.stopDataSourceSyncJob(input, logger: logger)
    }

    /// Enables you to provide feedback to Amazon Kendra to improve the performance of your index.  SubmitFeedback is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func submitFeedback(_ input: SubmitFeedbackRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "SubmitFeedback", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Enables you to provide feedback to Amazon Kendra to improve the performance of your index.  SubmitFeedback is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - clickFeedbackItems: Tells Amazon Kendra that a particular search result link was chosen by the user.
    ///   - indexId: The identifier of the index that was queried.
    ///   - queryId: The identifier of the specific query for which you are submitting feedback. The query ID is returned in the response to the Query API.
    ///   - relevanceFeedbackItems: Provides Amazon Kendra with relevant or not relevant feedback for whether a particular item was relevant to the search.
    ///   - logger: Logger use during operation
    @inlinable
    public func submitFeedback(
        clickFeedbackItems: [ClickFeedback]? = nil,
        indexId: String,
        queryId: String,
        relevanceFeedbackItems: [RelevanceFeedback]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = SubmitFeedbackRequest(
            clickFeedbackItems: clickFeedbackItems, 
            indexId: indexId, 
            queryId: queryId, 
            relevanceFeedbackItems: relevanceFeedbackItems
        )
        return try await self.submitFeedback(input, logger: logger)
    }

    /// Adds the specified tag to the specified index, FAQ, data source, or other resource. If  the tag already exists, the existing value is replaced with the new value.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds the specified tag to the specified index, FAQ, data source, or other resource. If  the tag already exists, the existing value is replaced with the new value.
    ///
    /// Parameters:
    ///   - resourceARN: The Amazon Resource Name (ARN) of the index, FAQ, data source, or other resource to add a tag.  For example, the ARN of an index is constructed as follows:  arn:aws:kendra:your-region:your-account-id:index/index-id   For information on how to construct an ARN for all types of Amazon Kendra resources, see  Resource  types.
    ///   - tags: A list of tag keys to add to the index, FAQ, data source, or other resource. If a tag already  exists, the existing value is replaced with the new value.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceARN: String,
        tags: [Tag],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceARN: resourceARN, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes a tag from an index, FAQ, data source, or other resource.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes a tag from an index, FAQ, data source, or other resource.
    ///
    /// Parameters:
    ///   - resourceARN: The Amazon Resource Name (ARN) of the index, FAQ, data source, or other resource to remove a tag.  For example, the ARN of an index is constructed as follows:  arn:aws:kendra:your-region:your-account-id:index/index-id  For information on how to construct an ARN for all types of Amazon Kendra resources, see  Resource  types.
    ///   - tagKeys: A list of tag keys to remove from the index, FAQ, data source, or other resource. If a tag  key doesn't exist for the resource, it is ignored.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceARN: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceARN: resourceARN, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates an access control configuration for your documents in an index. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents. You can update an access control configuration you created without indexing all of your documents again. For example, your index contains top-secret company documents that only certain employees or users should access. You created an 'allow' access control configuration for one user who recently joined the 'top-secret' team, switching from a team with 'deny' access to top-secret documents. However, the user suddenly returns to their previous team and should no longer have access to top secret documents. You can update the access control configuration to re-configure access control for your documents as circumstances change. You call the BatchPutDocument API to apply the updated access control configuration, with the AccessControlConfigurationId included in the Document object. If you use an S3 bucket as a data source, you synchronize your data source to apply the AccessControlConfigurationId in the .metadata.json file. Amazon Kendra currently only supports access control configuration for S3 data sources and documents indexed using the BatchPutDocument API.  You can't configure access control using CreateAccessControlConfiguration for an Amazon Kendra Gen AI Enterprise Edition index. Amazon Kendra will return a ValidationException error for a Gen_AI_ENTERPRISE_EDITION index.
    @Sendable
    @inlinable
    public func updateAccessControlConfiguration(_ input: UpdateAccessControlConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateAccessControlConfigurationResponse {
        try await self.client.execute(
            operation: "UpdateAccessControlConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an access control configuration for your documents in an index. This includes user and group access information for your documents. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents. You can update an access control configuration you created without indexing all of your documents again. For example, your index contains top-secret company documents that only certain employees or users should access. You created an 'allow' access control configuration for one user who recently joined the 'top-secret' team, switching from a team with 'deny' access to top-secret documents. However, the user suddenly returns to their previous team and should no longer have access to top secret documents. You can update the access control configuration to re-configure access control for your documents as circumstances change. You call the BatchPutDocument API to apply the updated access control configuration, with the AccessControlConfigurationId included in the Document object. If you use an S3 bucket as a data source, you synchronize your data source to apply the AccessControlConfigurationId in the .metadata.json file. Amazon Kendra currently only supports access control configuration for S3 data sources and documents indexed using the BatchPutDocument API.  You can't configure access control using CreateAccessControlConfiguration for an Amazon Kendra Gen AI Enterprise Edition index. Amazon Kendra will return a ValidationException error for a Gen_AI_ENTERPRISE_EDITION index.
    ///
    /// Parameters:
    ///   - accessControlList: Information you want to update on principals (users and/or groups) and which documents they should have access to. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.
    ///   - description: A new description for the access control configuration.
    ///   - hierarchicalAccessControlList: The updated list of principal lists that define the hierarchy for which documents users should have access to.
    ///   - id: The identifier of the access control configuration you want to update.
    ///   - indexId: The identifier of the index for an access control configuration.
    ///   - name: A new name for the access control configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateAccessControlConfiguration(
        accessControlList: [Principal]? = nil,
        description: String? = nil,
        hierarchicalAccessControlList: [HierarchicalPrincipal]? = nil,
        id: String,
        indexId: String,
        name: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateAccessControlConfigurationResponse {
        let input = UpdateAccessControlConfigurationRequest(
            accessControlList: accessControlList, 
            description: description, 
            hierarchicalAccessControlList: hierarchicalAccessControlList, 
            id: id, 
            indexId: indexId, 
            name: name
        )
        return try await self.updateAccessControlConfiguration(input, logger: logger)
    }

    /// Updates an Amazon Kendra data source connector.
    @Sendable
    @inlinable
    public func updateDataSource(_ input: UpdateDataSourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "UpdateDataSource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an Amazon Kendra data source connector.
    ///
    /// Parameters:
    ///   - configuration: Configuration information you want to update for the data source connector.
    ///   - customDocumentEnrichmentConfiguration: Configuration information you want to update for altering document metadata and content during the document ingestion process. For more information on how to create, modify and delete document metadata, or make other content alterations when you ingest documents into Amazon Kendra, see Customizing document metadata during the ingestion process.
    ///   - description: A new description for the data source connector.
    ///   - id: The identifier of the data source connector you want to update.
    ///   - indexId: The identifier of the index used with the data source connector.
    ///   - languageCode: The code for a language you want to update for the data source connector.  This allows you to support a language for all  documents when updating the data source. English is supported  by default. For more information on supported languages, including their codes,  see Adding  documents in languages other than English.
    ///   - name: A new name for the data source connector.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission to access  the data source and required resources. For more information, see IAM roles for Amazon Kendra.
    ///   - schedule: The sync schedule you want to update for the data source connector.
    ///   - vpcConfiguration: Configuration information for an Amazon Virtual Private Cloud to connect to your data source. For more information, see Configuring a VPC.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateDataSource(
        configuration: DataSourceConfiguration? = nil,
        customDocumentEnrichmentConfiguration: CustomDocumentEnrichmentConfiguration? = nil,
        description: String? = nil,
        id: String,
        indexId: String,
        languageCode: String? = nil,
        name: String? = nil,
        roleArn: String? = nil,
        schedule: String? = nil,
        vpcConfiguration: DataSourceVpcConfiguration? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = UpdateDataSourceRequest(
            configuration: configuration, 
            customDocumentEnrichmentConfiguration: customDocumentEnrichmentConfiguration, 
            description: description, 
            id: id, 
            indexId: indexId, 
            languageCode: languageCode, 
            name: name, 
            roleArn: roleArn, 
            schedule: schedule, 
            vpcConfiguration: vpcConfiguration
        )
        return try await self.updateDataSource(input, logger: logger)
    }

    /// Updates your Amazon Kendra experience such as a search application. For more information on creating a search application experience, see Building a  search experience with no code.
    @Sendable
    @inlinable
    public func updateExperience(_ input: UpdateExperienceRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "UpdateExperience", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates your Amazon Kendra experience such as a search application. For more information on creating a search application experience, see Building a  search experience with no code.
    ///
    /// Parameters:
    ///   - configuration: Configuration information you want to update for your Amazon Kendra experience.
    ///   - description: A new description for your Amazon Kendra experience.
    ///   - id: The identifier of your Amazon Kendra experience you want to update.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - name: A new name for your Amazon Kendra experience.
    ///   - roleArn: The Amazon Resource Name (ARN) of an IAM role with permission to access  the Query API, QuerySuggestions API, SubmitFeedback API, and IAM Identity Center that stores your users and groups information.  For more information, see IAM roles for Amazon Kendra.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateExperience(
        configuration: ExperienceConfiguration? = nil,
        description: String? = nil,
        id: String,
        indexId: String,
        name: String? = nil,
        roleArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = UpdateExperienceRequest(
            configuration: configuration, 
            description: description, 
            id: id, 
            indexId: indexId, 
            name: name, 
            roleArn: roleArn
        )
        return try await self.updateExperience(input, logger: logger)
    }

    /// Updates a set of featured results. Features results are placed above  all other results for certain queries. You map specific queries to specific documents for featuring in the results. If a query contains an exact match of a query, then one  or more specific documents are featured in the search results.
    @Sendable
    @inlinable
    public func updateFeaturedResultsSet(_ input: UpdateFeaturedResultsSetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateFeaturedResultsSetResponse {
        try await self.client.execute(
            operation: "UpdateFeaturedResultsSet", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a set of featured results. Features results are placed above  all other results for certain queries. You map specific queries to specific documents for featuring in the results. If a query contains an exact match of a query, then one  or more specific documents are featured in the search results.
    ///
    /// Parameters:
    ///   - description: A new description for the set of featured results.
    ///   - featuredDocuments: A list of document IDs for the documents you want to feature at the  top of the search results page. For more information on the list of  featured documents, see FeaturedResultsSet.
    ///   - featuredResultsSetId: The identifier of the set of featured results that you want to update.
    ///   - featuredResultsSetName: A new name for the set of featured results.
    ///   - indexId: The identifier of the index used for featuring results.
    ///   - queryTexts: A list of queries for featuring results. For more information on the  list of queries, see FeaturedResultsSet.
    ///   - status: You can set the status to ACTIVE or INACTIVE.  When the value is ACTIVE, featured results are ready for  use. You can still configure your settings before setting the status  to ACTIVE. The queries you specify for featured results  must be unique per featured results set for each index, whether the  status is ACTIVE or INACTIVE.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateFeaturedResultsSet(
        description: String? = nil,
        featuredDocuments: [FeaturedDocument]? = nil,
        featuredResultsSetId: String,
        featuredResultsSetName: String? = nil,
        indexId: String,
        queryTexts: [String]? = nil,
        status: FeaturedResultsSetStatus? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateFeaturedResultsSetResponse {
        let input = UpdateFeaturedResultsSetRequest(
            description: description, 
            featuredDocuments: featuredDocuments, 
            featuredResultsSetId: featuredResultsSetId, 
            featuredResultsSetName: featuredResultsSetName, 
            indexId: indexId, 
            queryTexts: queryTexts, 
            status: status
        )
        return try await self.updateFeaturedResultsSet(input, logger: logger)
    }

    /// Updates an Amazon Kendra index.
    @Sendable
    @inlinable
    public func updateIndex(_ input: UpdateIndexRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "UpdateIndex", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an Amazon Kendra index.
    ///
    /// Parameters:
    ///   - capacityUnits: Sets the number of additional document storage and query capacity units that should be used by the index. You can change the capacity of the index up to 5 times per day, or make 5 API calls. If you are using extra storage units, you can't reduce the storage capacity below what is required to meet the storage needs for your index.
    ///   - description: A new description for the index.
    ///   - documentMetadataConfigurationUpdates: The document metadata configuration you want to update for the index. Document metadata are fields or attributes associated with your documents. For example, the company department name associated with each document.
    ///   - id: The identifier of the index you want to update.
    ///   - name: A new name for the index.
    ///   - roleArn: An Identity and Access Management (IAM) role that gives Amazon Kendra permission to access Amazon CloudWatch logs and metrics.
    ///   - userContextPolicy: The user context policy.  If you're using an Amazon Kendra Gen AI Enterprise Edition index, you can only use ATTRIBUTE_FILTER to filter search results by user context. If you're using an Amazon Kendra Gen AI Enterprise Edition index and you try to use USER_TOKEN to configure user context policy, Amazon Kendra returns a ValidationException error.
    ///   - userGroupResolutionConfiguration: Gets users and groups from IAM Identity Center identity source. To configure this, see UserGroupResolutionConfiguration. This is useful for user context filtering, where search results are filtered based on the user or their group access to documents.  If you're using an Amazon Kendra Gen AI Enterprise Edition index, UserGroupResolutionConfiguration isn't supported.
    ///   - userTokenConfigurations: The user token configuration.  If you're using an Amazon Kendra Gen AI Enterprise Edition index and you try to use UserTokenConfigurations to configure user context policy, Amazon Kendra returns a ValidationException error.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateIndex(
        capacityUnits: CapacityUnitsConfiguration? = nil,
        description: String? = nil,
        documentMetadataConfigurationUpdates: [DocumentMetadataConfiguration]? = nil,
        id: String,
        name: String? = nil,
        roleArn: String? = nil,
        userContextPolicy: UserContextPolicy? = nil,
        userGroupResolutionConfiguration: UserGroupResolutionConfiguration? = nil,
        userTokenConfigurations: [UserTokenConfiguration]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = UpdateIndexRequest(
            capacityUnits: capacityUnits, 
            description: description, 
            documentMetadataConfigurationUpdates: documentMetadataConfigurationUpdates, 
            id: id, 
            name: name, 
            roleArn: roleArn, 
            userContextPolicy: userContextPolicy, 
            userGroupResolutionConfiguration: userGroupResolutionConfiguration, 
            userTokenConfigurations: userTokenConfigurations
        )
        return try await self.updateIndex(input, logger: logger)
    }

    /// Updates a block list used for query suggestions for an index. Updates to a block list might not take effect right away. Amazon Kendra  needs to refresh the entire suggestions list to apply any updates to the  block list. Other changes not related to the block list apply immediately. If a block list is updating, then you need to wait for the first update to  finish before submitting another update. Amazon Kendra supports partial updates, so you only need to provide the fields  you want to update.  UpdateQuerySuggestionsBlockList is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func updateQuerySuggestionsBlockList(_ input: UpdateQuerySuggestionsBlockListRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "UpdateQuerySuggestionsBlockList", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a block list used for query suggestions for an index. Updates to a block list might not take effect right away. Amazon Kendra  needs to refresh the entire suggestions list to apply any updates to the  block list. Other changes not related to the block list apply immediately. If a block list is updating, then you need to wait for the first update to  finish before submitting another update. Amazon Kendra supports partial updates, so you only need to provide the fields  you want to update.  UpdateQuerySuggestionsBlockList is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - description: A new description for the block list.
    ///   - id: The identifier of the block list you want to update.
    ///   - indexId: The identifier of the index for the block list.
    ///   - name: A new name for the block list.
    ///   - roleArn: The IAM (Identity and Access Management) role used to access the  block list text file in S3.
    ///   - sourceS3Path: The S3 path where your block list text file sits in S3. If you update your block list and provide the same path to the  block list text file in S3, then Amazon Kendra reloads the file to refresh  the block list. Amazon Kendra does not automatically refresh your block list.  You need to call the UpdateQuerySuggestionsBlockList API  to refresh you block list. If you update your block list, then Amazon Kendra asynchronously refreshes  all query suggestions with the latest content in the S3 file. This  means changes might not take effect immediately.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateQuerySuggestionsBlockList(
        description: String? = nil,
        id: String,
        indexId: String,
        name: String? = nil,
        roleArn: String? = nil,
        sourceS3Path: S3Path? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = UpdateQuerySuggestionsBlockListRequest(
            description: description, 
            id: id, 
            indexId: indexId, 
            name: name, 
            roleArn: roleArn, 
            sourceS3Path: sourceS3Path
        )
        return try await self.updateQuerySuggestionsBlockList(input, logger: logger)
    }

    /// Updates the settings of query suggestions for an index. Amazon Kendra supports partial updates, so you only need to provide  the fields you want to update. If an update is currently processing, you  need to wait for the update to finish before making another update. Updates to query suggestions settings might not take effect right away.  The time for your updated settings to take effect depends on the updates  made and the number of search queries in your index. You can still enable/disable query suggestions at any time.  UpdateQuerySuggestionsConfig is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    @Sendable
    @inlinable
    public func updateQuerySuggestionsConfig(_ input: UpdateQuerySuggestionsConfigRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "UpdateQuerySuggestionsConfig", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the settings of query suggestions for an index. Amazon Kendra supports partial updates, so you only need to provide  the fields you want to update. If an update is currently processing, you  need to wait for the update to finish before making another update. Updates to query suggestions settings might not take effect right away.  The time for your updated settings to take effect depends on the updates  made and the number of search queries in your index. You can still enable/disable query suggestions at any time.  UpdateQuerySuggestionsConfig is currently not supported in the  Amazon Web Services GovCloud (US-West) region.
    ///
    /// Parameters:
    ///   - attributeSuggestionsConfig: Configuration information for the document fields/attributes that you want to base  query suggestions on.
    ///   - includeQueriesWithoutUserInformation:  TRUE to include queries without user information (i.e. all queries,  irrespective of the user), otherwise FALSE to only include queries  with user information. If you pass user information to Amazon Kendra along with the queries, you can set this  flag to FALSE and instruct Amazon Kendra to only consider queries with user  information. If you set to FALSE, Amazon Kendra only considers queries searched at least  MinimumQueryCount times across MinimumNumberOfQueryingUsers  unique users for suggestions. If you set to TRUE, Amazon Kendra ignores all user information and learns  from all queries.
    ///   - indexId:  The identifier of the index with query suggestions you want to update.
    ///   - minimumNumberOfQueryingUsers: The minimum number of unique users who must search a query in order for the query  to be eligible to suggest to your users. Increasing this number might decrease the number of suggestions. However, this  ensures a query is searched by many users and is truly popular to suggest to users. How you tune this setting depends on your specific needs.
    ///   - minimumQueryCount: The the minimum number of times a query must be searched in order to be  eligible to suggest to your users. Decreasing this number increases the number of suggestions. However, this  affects the quality of suggestions as it sets a low bar for a query to be  considered popular to suggest to users. How you tune this setting depends on your specific needs.
    ///   - mode: Set the mode to ENABLED or LEARN_ONLY. By default, Amazon Kendra enables query suggestions.  LEARN_ONLY mode allows you to turn off query suggestions.  You can to update this at any time. In LEARN_ONLY mode, Amazon Kendra continues to learn from new  queries to keep suggestions up to date for when you are ready to  switch to ENABLED mode again.
    ///   - queryLogLookBackWindowInDays: How recent your queries are in your query log time window. The time window is the number of days from current day to past days. By default, Amazon Kendra sets this to 180.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateQuerySuggestionsConfig(
        attributeSuggestionsConfig: AttributeSuggestionsUpdateConfig? = nil,
        includeQueriesWithoutUserInformation: Bool? = nil,
        indexId: String,
        minimumNumberOfQueryingUsers: Int? = nil,
        minimumQueryCount: Int? = nil,
        mode: Mode? = nil,
        queryLogLookBackWindowInDays: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = UpdateQuerySuggestionsConfigRequest(
            attributeSuggestionsConfig: attributeSuggestionsConfig, 
            includeQueriesWithoutUserInformation: includeQueriesWithoutUserInformation, 
            indexId: indexId, 
            minimumNumberOfQueryingUsers: minimumNumberOfQueryingUsers, 
            minimumQueryCount: minimumQueryCount, 
            mode: mode, 
            queryLogLookBackWindowInDays: queryLogLookBackWindowInDays
        )
        return try await self.updateQuerySuggestionsConfig(input, logger: logger)
    }

    /// Updates a thesaurus for an index.
    @Sendable
    @inlinable
    public func updateThesaurus(_ input: UpdateThesaurusRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "UpdateThesaurus", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a thesaurus for an index.
    ///
    /// Parameters:
    ///   - description: A new description for the thesaurus.
    ///   - id: The identifier of the thesaurus you want to update.
    ///   - indexId: The identifier of the index for the thesaurus.
    ///   - name: A new name for the thesaurus.
    ///   - roleArn: An IAM role that gives Amazon Kendra permissions to  access thesaurus file specified in SourceS3Path.
    ///   - sourceS3Path: 
    ///   - logger: Logger use during operation
    @inlinable
    public func updateThesaurus(
        description: String? = nil,
        id: String,
        indexId: String,
        name: String? = nil,
        roleArn: String? = nil,
        sourceS3Path: S3Path? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = UpdateThesaurusRequest(
            description: description, 
            id: id, 
            indexId: indexId, 
            name: name, 
            roleArn: roleArn, 
            sourceS3Path: sourceS3Path
        )
        return try await self.updateThesaurus(input, logger: logger)
    }
}

extension Kendra {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: Kendra, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension Kendra {
    /// Return PaginatorSequence for operation ``getSnapshots(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func getSnapshotsPaginator(
        _ input: GetSnapshotsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<GetSnapshotsRequest, GetSnapshotsResponse> {
        return .init(
            input: input,
            command: self.getSnapshots,
            inputKey: \GetSnapshotsRequest.nextToken,
            outputKey: \GetSnapshotsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``getSnapshots(_:logger:)``.
    ///
    /// - Parameters:
    ///   - indexId: The identifier of the index to get search metrics data.
    ///   - interval: The time interval or time window to get search metrics data. The time interval uses the time zone of your index. You can view data in the following time windows:    THIS_WEEK: The current week, starting on the Sunday and ending on the day before the current date.    ONE_WEEK_AGO: The previous week, starting on the Sunday and ending on the following Saturday.    TWO_WEEKS_AGO: The week before the previous week, starting on the Sunday and ending on the following Saturday.    THIS_MONTH: The current month, starting on the first day of the month and ending on the day before the current date.    ONE_MONTH_AGO: The previous month, starting on the first day of the month and ending on the last day of the month.    TWO_MONTHS_AGO: The month before the previous month, starting on the first day of the month and ending on last day of the month.
    ///   - maxResults: The maximum number of returned data for the metric.
    ///   - metricType: The metric you want to retrieve. You can specify only one metric per call. For more information about the metrics you can view, see Gaining insights with search analytics.
    ///   - logger: Logger used for logging
    @inlinable
    public func getSnapshotsPaginator(
        indexId: String,
        interval: Interval,
        maxResults: Int? = nil,
        metricType: MetricType,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<GetSnapshotsRequest, GetSnapshotsResponse> {
        let input = GetSnapshotsRequest(
            indexId: indexId, 
            interval: interval, 
            maxResults: maxResults, 
            metricType: metricType
        )
        return self.getSnapshotsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listAccessControlConfigurations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAccessControlConfigurationsPaginator(
        _ input: ListAccessControlConfigurationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAccessControlConfigurationsRequest, ListAccessControlConfigurationsResponse> {
        return .init(
            input: input,
            command: self.listAccessControlConfigurations,
            inputKey: \ListAccessControlConfigurationsRequest.nextToken,
            outputKey: \ListAccessControlConfigurationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAccessControlConfigurations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - indexId: The identifier of the index for the access control configuration.
    ///   - maxResults: The maximum number of access control configurations to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAccessControlConfigurationsPaginator(
        indexId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAccessControlConfigurationsRequest, ListAccessControlConfigurationsResponse> {
        let input = ListAccessControlConfigurationsRequest(
            indexId: indexId, 
            maxResults: maxResults
        )
        return self.listAccessControlConfigurationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listDataSourceSyncJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listDataSourceSyncJobsPaginator(
        _ input: ListDataSourceSyncJobsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListDataSourceSyncJobsRequest, ListDataSourceSyncJobsResponse> {
        return .init(
            input: input,
            command: self.listDataSourceSyncJobs,
            inputKey: \ListDataSourceSyncJobsRequest.nextToken,
            outputKey: \ListDataSourceSyncJobsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listDataSourceSyncJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - id: The identifier of the data source connector.
    ///   - indexId: The identifier of the index used with the data source connector.
    ///   - maxResults: The maximum number of synchronization jobs to return in the response. If there are fewer results in the list, this response contains only the actual results.
    ///   - startTimeFilter: When specified, the synchronization jobs returned in the list are limited to jobs between the specified dates.
    ///   - statusFilter: Only returns synchronization jobs with the Status field equal to the specified status.
    ///   - logger: Logger used for logging
    @inlinable
    public func listDataSourceSyncJobsPaginator(
        id: String,
        indexId: String,
        maxResults: Int? = nil,
        startTimeFilter: TimeRange? = nil,
        statusFilter: DataSourceSyncJobStatus? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListDataSourceSyncJobsRequest, ListDataSourceSyncJobsResponse> {
        let input = ListDataSourceSyncJobsRequest(
            id: id, 
            indexId: indexId, 
            maxResults: maxResults, 
            startTimeFilter: startTimeFilter, 
            statusFilter: statusFilter
        )
        return self.listDataSourceSyncJobsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listDataSources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listDataSourcesPaginator(
        _ input: ListDataSourcesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListDataSourcesRequest, ListDataSourcesResponse> {
        return .init(
            input: input,
            command: self.listDataSources,
            inputKey: \ListDataSourcesRequest.nextToken,
            outputKey: \ListDataSourcesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listDataSources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - indexId: The identifier of the index used with one or more data source connectors.
    ///   - maxResults: The maximum number of data source connectors to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listDataSourcesPaginator(
        indexId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListDataSourcesRequest, ListDataSourcesResponse> {
        let input = ListDataSourcesRequest(
            indexId: indexId, 
            maxResults: maxResults
        )
        return self.listDataSourcesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listEntityPersonas(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listEntityPersonasPaginator(
        _ input: ListEntityPersonasRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListEntityPersonasRequest, ListEntityPersonasResponse> {
        return .init(
            input: input,
            command: self.listEntityPersonas,
            inputKey: \ListEntityPersonasRequest.nextToken,
            outputKey: \ListEntityPersonasResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listEntityPersonas(_:logger:)``.
    ///
    /// - Parameters:
    ///   - id: The identifier of your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - maxResults: The maximum number of returned users or groups.
    ///   - logger: Logger used for logging
    @inlinable
    public func listEntityPersonasPaginator(
        id: String,
        indexId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListEntityPersonasRequest, ListEntityPersonasResponse> {
        let input = ListEntityPersonasRequest(
            id: id, 
            indexId: indexId, 
            maxResults: maxResults
        )
        return self.listEntityPersonasPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listExperienceEntities(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listExperienceEntitiesPaginator(
        _ input: ListExperienceEntitiesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListExperienceEntitiesRequest, ListExperienceEntitiesResponse> {
        return .init(
            input: input,
            command: self.listExperienceEntities,
            inputKey: \ListExperienceEntitiesRequest.nextToken,
            outputKey: \ListExperienceEntitiesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listExperienceEntities(_:logger:)``.
    ///
    /// - Parameters:
    ///   - id: The identifier of your Amazon Kendra experience.
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - logger: Logger used for logging
    @inlinable
    public func listExperienceEntitiesPaginator(
        id: String,
        indexId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListExperienceEntitiesRequest, ListExperienceEntitiesResponse> {
        let input = ListExperienceEntitiesRequest(
            id: id, 
            indexId: indexId
        )
        return self.listExperienceEntitiesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listExperiences(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listExperiencesPaginator(
        _ input: ListExperiencesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListExperiencesRequest, ListExperiencesResponse> {
        return .init(
            input: input,
            command: self.listExperiences,
            inputKey: \ListExperiencesRequest.nextToken,
            outputKey: \ListExperiencesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listExperiences(_:logger:)``.
    ///
    /// - Parameters:
    ///   - indexId: The identifier of the index for your Amazon Kendra experience.
    ///   - maxResults: The maximum number of returned Amazon Kendra experiences.
    ///   - logger: Logger used for logging
    @inlinable
    public func listExperiencesPaginator(
        indexId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListExperiencesRequest, ListExperiencesResponse> {
        let input = ListExperiencesRequest(
            indexId: indexId, 
            maxResults: maxResults
        )
        return self.listExperiencesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listFaqs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listFaqsPaginator(
        _ input: ListFaqsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListFaqsRequest, ListFaqsResponse> {
        return .init(
            input: input,
            command: self.listFaqs,
            inputKey: \ListFaqsRequest.nextToken,
            outputKey: \ListFaqsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listFaqs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - indexId: The index for the FAQs.
    ///   - maxResults: The maximum number of FAQs to return in the response. If there are fewer results in the list, this response contains only the actual results.
    ///   - logger: Logger used for logging
    @inlinable
    public func listFaqsPaginator(
        indexId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListFaqsRequest, ListFaqsResponse> {
        let input = ListFaqsRequest(
            indexId: indexId, 
            maxResults: maxResults
        )
        return self.listFaqsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listGroupsOlderThanOrderingId(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listGroupsOlderThanOrderingIdPaginator(
        _ input: ListGroupsOlderThanOrderingIdRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListGroupsOlderThanOrderingIdRequest, ListGroupsOlderThanOrderingIdResponse> {
        return .init(
            input: input,
            command: self.listGroupsOlderThanOrderingId,
            inputKey: \ListGroupsOlderThanOrderingIdRequest.nextToken,
            outputKey: \ListGroupsOlderThanOrderingIdResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listGroupsOlderThanOrderingId(_:logger:)``.
    ///
    /// - Parameters:
    ///   - dataSourceId: The identifier of the data source for getting a list of groups mapped to users before a given ordering timestamp identifier.
    ///   - indexId: The identifier of the index for getting a list of groups mapped to users before a given ordering or timestamp identifier.
    ///   - maxResults:  The maximum number of returned groups that are mapped to users before a given ordering or timestamp identifier.
    ///   - orderingId: The timestamp identifier used for the latest PUT or DELETE action for mapping users to their groups.
    ///   - logger: Logger used for logging
    @inlinable
    public func listGroupsOlderThanOrderingIdPaginator(
        dataSourceId: String? = nil,
        indexId: String,
        maxResults: Int? = nil,
        orderingId: Int64,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListGroupsOlderThanOrderingIdRequest, ListGroupsOlderThanOrderingIdResponse> {
        let input = ListGroupsOlderThanOrderingIdRequest(
            dataSourceId: dataSourceId, 
            indexId: indexId, 
            maxResults: maxResults, 
            orderingId: orderingId
        )
        return self.listGroupsOlderThanOrderingIdPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listIndices(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listIndicesPaginator(
        _ input: ListIndicesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListIndicesRequest, ListIndicesResponse> {
        return .init(
            input: input,
            command: self.listIndices,
            inputKey: \ListIndicesRequest.nextToken,
            outputKey: \ListIndicesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listIndices(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of indices to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listIndicesPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListIndicesRequest, ListIndicesResponse> {
        let input = ListIndicesRequest(
            maxResults: maxResults
        )
        return self.listIndicesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listQuerySuggestionsBlockLists(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listQuerySuggestionsBlockListsPaginator(
        _ input: ListQuerySuggestionsBlockListsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListQuerySuggestionsBlockListsRequest, ListQuerySuggestionsBlockListsResponse> {
        return .init(
            input: input,
            command: self.listQuerySuggestionsBlockLists,
            inputKey: \ListQuerySuggestionsBlockListsRequest.nextToken,
            outputKey: \ListQuerySuggestionsBlockListsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listQuerySuggestionsBlockLists(_:logger:)``.
    ///
    /// - Parameters:
    ///   - indexId: The identifier of the index for a list of all block lists that exist for  that index. For information on the current quota limits for block lists, see  Quotas  for Amazon Kendra.
    ///   - maxResults: The maximum number of block lists to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listQuerySuggestionsBlockListsPaginator(
        indexId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListQuerySuggestionsBlockListsRequest, ListQuerySuggestionsBlockListsResponse> {
        let input = ListQuerySuggestionsBlockListsRequest(
            indexId: indexId, 
            maxResults: maxResults
        )
        return self.listQuerySuggestionsBlockListsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listThesauri(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listThesauriPaginator(
        _ input: ListThesauriRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListThesauriRequest, ListThesauriResponse> {
        return .init(
            input: input,
            command: self.listThesauri,
            inputKey: \ListThesauriRequest.nextToken,
            outputKey: \ListThesauriResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listThesauri(_:logger:)``.
    ///
    /// - Parameters:
    ///   - indexId: The identifier of the index with one or more thesauri.
    ///   - maxResults: The maximum number of thesauri to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listThesauriPaginator(
        indexId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListThesauriRequest, ListThesauriResponse> {
        let input = ListThesauriRequest(
            indexId: indexId, 
            maxResults: maxResults
        )
        return self.listThesauriPaginator(input, logger: logger)
    }
}

extension Kendra.GetSnapshotsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.GetSnapshotsRequest {
        return .init(
            indexId: self.indexId,
            interval: self.interval,
            maxResults: self.maxResults,
            metricType: self.metricType,
            nextToken: token
        )
    }
}

extension Kendra.ListAccessControlConfigurationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListAccessControlConfigurationsRequest {
        return .init(
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Kendra.ListDataSourceSyncJobsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListDataSourceSyncJobsRequest {
        return .init(
            id: self.id,
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token,
            startTimeFilter: self.startTimeFilter,
            statusFilter: self.statusFilter
        )
    }
}

extension Kendra.ListDataSourcesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListDataSourcesRequest {
        return .init(
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Kendra.ListEntityPersonasRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListEntityPersonasRequest {
        return .init(
            id: self.id,
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Kendra.ListExperienceEntitiesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListExperienceEntitiesRequest {
        return .init(
            id: self.id,
            indexId: self.indexId,
            nextToken: token
        )
    }
}

extension Kendra.ListExperiencesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListExperiencesRequest {
        return .init(
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Kendra.ListFaqsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListFaqsRequest {
        return .init(
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Kendra.ListGroupsOlderThanOrderingIdRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListGroupsOlderThanOrderingIdRequest {
        return .init(
            dataSourceId: self.dataSourceId,
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token,
            orderingId: self.orderingId
        )
    }
}

extension Kendra.ListIndicesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListIndicesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Kendra.ListQuerySuggestionsBlockListsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListQuerySuggestionsBlockListsRequest {
        return .init(
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Kendra.ListThesauriRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Kendra.ListThesauriRequest {
        return .init(
            indexId: self.indexId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
